[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

BELATED ARTICLES

more