스프링

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