11package com .gdg .poppet .auth .application .service ;
22
3- import com .auth0 .jwt .JWT ;
4- import com .auth0 .jwt .algorithms .Algorithm ;
3+ import io .jsonwebtoken .Claims ;
4+ import io .jsonwebtoken .Jwts ;
5+ import io .jsonwebtoken .SignatureAlgorithm ;
6+ import io .jsonwebtoken .security .Keys ;
57import com .gdg .poppet .user .domain .enums .Provider ;
68import com .gdg .poppet .user .domain .repository .UserRepository ;
79import jakarta .servlet .http .HttpServletRequest ;
810import jakarta .servlet .http .HttpServletResponse ;
11+ import java .nio .charset .StandardCharsets ;
12+ import java .security .Key ;
913import java .util .Date ;
1014import java .util .Optional ;
1115import lombok .Getter ;
@@ -47,28 +51,38 @@ public class JwtService {
4751
4852 private final UserRepository userRepository ;
4953
54+ /**
55+ * 서명 키 생성
56+ */
57+ private Key getSigningKey () {
58+ byte [] keyBytes = secretKey .getBytes (StandardCharsets .UTF_8 );
59+ return Keys .hmacShaKeyFor (keyBytes );
60+ }
61+
5062 /**
5163 * AccessToken 생성 메소드
5264 */
5365 public String createAccessToken (String userId , Provider provider ) {
5466 Date now = new Date ();
55- return JWT .create () // JWT 토큰을 생성하는 빌더 반환
56- .withSubject (ACCESS_TOKEN_SUBJECT ) // JWT의 Subject 지정 -> AccessToken이므로 AccessToken
57- .withExpiresAt (new Date (now .getTime () + accessTokenExpirationPeriod )) // 토큰 만료 시간 설정
58- .withClaim (USER_ID_CLAIM , userId )
59- .withClaim (PROVIDER_CLAIM , provider .name ())
60- .sign (Algorithm .HMAC512 (secretKey )); // HMAC512 알고리즘 사용, application.yml에서 지정한 secret 키로 암호화
67+ return Jwts .builder ()
68+ .setSubject (ACCESS_TOKEN_SUBJECT )
69+ .setExpiration (new Date (now .getTime () + accessTokenExpirationPeriod ))
70+ .claim (USER_ID_CLAIM , userId )
71+ .claim (PROVIDER_CLAIM , provider .name ())
72+ .signWith (getSigningKey (), SignatureAlgorithm .HS512 )
73+ .compact ();
6174 }
6275
6376 /**
6477 * RefreshToken 생성 RefreshToken은 Claim에 email도 넣지 않으므로 withClaim() X
6578 */
6679 public String createRefreshToken () {
6780 Date now = new Date ();
68- return JWT .create ()
69- .withSubject (REFRESH_TOKEN_SUBJECT )
70- .withExpiresAt (new Date (now .getTime () + refreshTokenExpirationPeriod ))
71- .sign (Algorithm .HMAC512 (secretKey ));
81+ return Jwts .builder ()
82+ .setSubject (REFRESH_TOKEN_SUBJECT )
83+ .setExpiration (new Date (now .getTime () + refreshTokenExpirationPeriod ))
84+ .signWith (getSigningKey (), SignatureAlgorithm .HS512 )
85+ .compact ();
7286 }
7387
7488 /**
@@ -137,22 +151,25 @@ public void updateRefreshToken(String userId, Provider provider, String refreshT
137151
138152 public boolean isTokenValid (String token ) {
139153 try {
140- JWT .require (Algorithm .HMAC512 (secretKey )).build ().verify (token );
154+ Jwts .parserBuilder ()
155+ .setSigningKey (getSigningKey ())
156+ .build ()
157+ .parseClaimsJws (token );
141158 return true ;
142159 } catch (Exception e ) {
143160 log .error ("유효하지 않은 토큰입니다. {}" , e .getMessage ());
144161 return false ;
145162 }
146163 }
164+
147165 public Optional <String > extractUserId (String token ) {
148166 try {
149- return Optional .ofNullable (
150- JWT .require (Algorithm .HMAC512 (secretKey ))
151- .build ()
152- .verify (token )
153- .getClaim (USER_ID_CLAIM )
154- .asString ()
155- );
167+ Claims claims = Jwts .parserBuilder ()
168+ .setSigningKey (getSigningKey ())
169+ .build ()
170+ .parseClaimsJws (token )
171+ .getBody ();
172+ return Optional .ofNullable (claims .get (USER_ID_CLAIM , String .class ));
156173 } catch (Exception e ) {
157174 log .error ("유효하지 않은 토큰입니다. {}" , e .getMessage ());
158175 return Optional .empty ();
@@ -161,11 +178,12 @@ public Optional<String> extractUserId(String token) {
161178
162179 public Optional <Provider > extractProvider (String token ) {
163180 try {
164- String prov = JWT .require (Algorithm .HMAC512 (secretKey ))
181+ Claims claims = Jwts .parserBuilder ()
182+ .setSigningKey (getSigningKey ())
165183 .build ()
166- .verify (token )
167- .getClaim ( PROVIDER_CLAIM )
168- . asString ( );
184+ .parseClaimsJws (token )
185+ .getBody ();
186+ String prov = claims . get ( PROVIDER_CLAIM , String . class );
169187 return Optional .of (Provider .valueOf (prov ));
170188 } catch (Exception e ) {
171189 log .error ("프로바이더 추출 실패: {}" , e .getMessage ());
0 commit comments