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
'스프링' 카테고리의 다른 글
[스프링] 스케줄러 cron 사용하기 (0) | 2023.07.26 |
---|---|
[스프링 시큐리티] 스프링 부트 3.X 이상의 시큐리티 (0) | 2023.06.01 |
[스프링 시큐리티] redis를 이용한 jwt 로그아웃 만들기 (2) | 2023.01.31 |
[스프링 시큐리티] custom한 authentication받기 (0) | 2023.01.25 |
스프링 이메일 인증 (0) | 2021.11.12 |
댓글