스프링
OAuth2.0과 JWT적용 - 2
winwin-k9
2023. 1. 17. 19:29
토큰을 발급하고 검증 할 수 있는 컴포넌트를 작성한다.
토큰은 API서버에 접근하기 위한 인증 토큰과 인증 토큰이 만료되었을 경우 리프레쉬에 사용할 리프레쉬 토큰으로 이루어져 있다.
@NoArgsConstructor
@Getter
public class Token {
private String accessToken;
private String refreshToken;
public Token(String token, String refreshToken) {
this.accessToken = token;
this.refreshToken = refreshToken;
}
}
토큰을 발행해주는 tokenService를 구한다.
@Service
public class TokenService{
private String secretKey = "token-secret-key";
@PostConstruct
protected void init() {
secretKey = Base64.getEncoder().encodeToString(secretKey.getBytes());
}
public Token generateToken(String uid, String name) {
long tokenPeriod = 1000L * 60L * 10L;
long refreshPeriod = 1000L * 60L * 60L * 24L * 30L * 3L;
Claims claims = Jwts.claims().setSubject(uid);
claims.put("name", name);
Date now = new Date();
return new Token(Jwts.builder()
.setClaims(claims) // 정보 저장
.setIssuedAt(now) // 토큰 발행 시간 정보
.setExpiration(new Date(now.getTime() + tokenPeriod)) // 토큰 유효시각 설정
.signWith(Keys.hmacShaKeyFor(Decoders.BASE64.decode(secretKey)),
SignatureAlgorithm.HS256) // 암호화 알고리즘과, secret 값
.compact(),
Jwts.builder()
.setClaims(claims)
.setIssuedAt(now)
.setExpiration(new Date(now.getTime() + refreshPeriod)) // refresh기간 설정
.signWith(Keys.hmacShaKeyFor(Decoders.BASE64.decode(secretKey)),
SignatureAlgorithm.HS256)
.compact());
}
public String getUid(String token) {
return Jwts.parserBuilder()
.setSigningKey(secretKey)
.build()
.parseClaimsJws(token)
.getBody().getSubject();
}
}
728x90