[Security] JJWT 라이브러리 Jwts.builder().setSubject null 문제
2023. 1. 9. 01:22
JWT와 redis를 이용해서 토큰 재발급 로직을 작성하다 만난 에러
public void reIssue(AuthRequestDto.ReIssue reIssue, HttpServletResponse response) {
//Refresh Token 검증
if (!jwtTokenProvider.validateToken(reIssue.getRefreshToken())) {
throw new BusinessLogicException(ExceptionCode.INVALID_TOKEN);
}
String accessToken = jwtTokenProvider.resolveToken(reIssue.getAccessToken());
//AccessToken으로 Authentication 생성
Authentication authentication = jwtTokenProvider.getAuthentication(accessToken);
//...
}
public Authentication getAuthentication(String accessToken) {
//...
UserDetails principal = new User(claims.getSubject(), "", authorities);
return new UsernamePasswordAuthenticationToken(principal, "", authorities);
}
public AuthResponseDto.TokenInfo generateToken(Map<String,Object> claims, String subject) {
//..
System.out.println(subject);
String accessToken = Jwts.builder()
.setSubject(subject)
.setClaims(claims)
.setExpiration(accessTokenExpiresIn)
.signWith(key)
.compact();
//...
}
위와 같은 로직으로 작성했는데 로그인 요청에 대한 처리로 AccessToken과 RefreshToken은 정상발급 되는데 재발급 요청에선 다음과 같은 에러가 찍히면서 authentication객체가 만들어지지 않았다.
java.lang.IllegalArgumentException: Cannot pass null or empty values to constructor
디버깅을 해보니 토큰을 발행할 때 setsubject가 적용되지 않았고 토큰 claims에 subject가 없어서 authentication 객체를 만들지 못했었다.
해결방법은 간단했다.
Jwts.builder()
.setClaims(claims)
.setSubject(subject)
setClaims를 setSubject보다 먼저 적용하면 된다.
https://github.com/jwtk/jjwt/issues/179
'Programming > Security' 카테고리의 다른 글
[Security] Spring Security 인증 처리 과정 (0) | 2022.12.01 |
---|