ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • OAuth2.0과 JWT적용 - 2
    스프링 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

    '스프링' 카테고리의 다른 글

    UsernamePasswordAuthenticationFilter  (0) 2023.01.19
    JWT 토큰 체크  (0) 2023.01.19
    OAuth2.0과 JWT적용 - 1  (0) 2023.01.17
    security버전  (0) 2023.01.15
    [Test] Mockito 기반의 Spring 단위 테스트  (0) 2023.01.12

    댓글

Designed by Tistory.