본문 바로가기
스프링

[스프링 시큐리티]JWT 토큰안에 내가 원하는 값 넣기

by 근즈리얼 2023. 4. 10.
728x90

오늘은 간단하게 JWT 토큰 안에 원하는 값을 넣어보겠습니다. 코드는 앞에서 만들었던 custom한 Authentication에서 이어집니다.

 

JWT 토큰안에 값을 추가하고 싶은 배경

  •  로그인 시 내려주는 accessToken값에는 로그인할 때 로그인 id만 내려가고 있었습니다.
  • 이로 인해, 프론트에서 지금 로그인한 계정의 정보가 부족하다는 요청이 있었습니다.
  • 프론트의 요청을 충족시켜 주기 위해 accessToken에 값을 추가해서 내리기로 결정했습니다.

제가 사용한 방법은 Jwts.builder()에 claim입니다.

claim은 key와 value형태로 데이터를 추가할 수 있습니다.

ex) claim("key", object)

public interface JwtBuilder extends ClaimsMutator<JwtBuilder> {
    
    ...
    
    JwtBuilder claim(String name, Object value);
    
    ...
}

이제 as-is와 to-be를 확인해 보겠습니다.

as-is

public TokenDTO generateTokenDTO(Authentication authentication) {

        // 권한들 가져오기
        String authorities = authentication.getAuthorities().stream()
                .map(GrantedAuthority::getAuthority).collect(
                        Collectors.joining(","));

        long now = (new Date()).getTime();

        // Acccess Token 생성
        Date accessTokenExpiresIn = new Date(now + ACCESS_TOKEN_EXPIRE_TIME);
        String accessToken = Jwts.builder()
                .setSubject(authentication.getName())
                .claim(AUTHORITIES_KEY, authorities)
                .setExpiration(accessTokenExpiresIn)
                .signWith(key, SignatureAlgorithm.HS512)
                .compact();

        // Refresh Token 생성
        String refreshToken = Jwts.builder()
                .setExpiration(new Date(now + REFRESH_TOKEN_EXPIRE_TIME))
                .signWith(key, SignatureAlgorithm.HS512)
                .compact();

        return TokenDTO.of(BEARER_TYPE, accessToken, refreshToken, accessTokenExpiresIn.getTime());
    }

 

to-be

public TokenDTO generateTokenDTO(Authentication authentication) {

        // 권한들 가져오기
        String authorities = authentication.getAuthorities().stream()
                .map(GrantedAuthority::getAuthority).collect(
                        Collectors.joining(","));

        long now = (new Date()).getTime();

        CustomDetails customDetails = (CustomDetails)authentication.getPrincipal();
        Users users = customDetails.getUsers();

        // Acccess Token 생성
        Date accessTokenExpiresIn = new Date(now + ACCESS_TOKEN_EXPIRE_TIME);
        String accessToken = Jwts.builder()
                .setSubject(authentication.getName())
                .claim("userDto", UserDTO.of(users.getId(), users.getName(), users.getEmail(), users.isMaster()))
                .claim(AUTHORITIES_KEY, authorities)
                .setExpiration(accessTokenExpiresIn)
                .signWith(key, SignatureAlgorithm.HS512)
                .compact();

        // Refresh Token 생성
        String refreshToken = Jwts.builder()
                .setExpiration(new Date(now + REFRESH_TOKEN_EXPIRE_TIME))
                .signWith(key, SignatureAlgorithm.HS512)
                .compact();

        return TokenDTO.of(BEARER_TYPE, accessToken, refreshToken, accessTokenExpiresIn.getTime());
    }

아래의 코드를 추가하고 jwt 토큰의 값이 달라진 것을 확인할 수 있습니다.

.claim("userDto", UserDTO.of(users.getId(), users.getName(), users.getEmail(), users.isMaster()))
728x90

댓글