Skip to content

Commit 33fd6ac

Browse files
committed
feat(auth): replace JWT Token library
1 parent 20d58c9 commit 33fd6ac

File tree

2 files changed

+43
-26
lines changed

2 files changed

+43
-26
lines changed

build.gradle

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,10 @@ dependencies {
2727
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
2828
implementation 'org.springframework.boot:spring-boot-starter-security'
2929
implementation("org.springframework.boot:spring-boot-starter-oauth2-client")
30-
implementation 'com.auth0:java-jwt:4.5.0'
3130
implementation 'org.springframework.boot:spring-boot-starter-web'
3231
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0'
3332

34-
// JWT 토큰 검증을 위한 의존성 (Apple 로그인용)
33+
// JWT 토큰 검증을 위한 의존성
3534
implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
3635
implementation 'io.jsonwebtoken:jjwt-impl:0.11.5'
3736
implementation 'io.jsonwebtoken:jjwt-jackson:0.11.5'

src/main/java/com/gdg/poppet/auth/application/service/JwtService.java

Lines changed: 42 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
package 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;
57
import com.gdg.poppet.user.domain.enums.Provider;
68
import com.gdg.poppet.user.domain.repository.UserRepository;
79
import jakarta.servlet.http.HttpServletRequest;
810
import jakarta.servlet.http.HttpServletResponse;
11+
import java.nio.charset.StandardCharsets;
12+
import java.security.Key;
913
import java.util.Date;
1014
import java.util.Optional;
1115
import 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

Comments
 (0)