Skip to content

Commit ec4101f

Browse files
authored
Merge pull request #41 from fix/token/2
Fix: token/2
2 parents b65dcfb + dc9dd70 commit ec4101f

File tree

5 files changed

+33
-58
lines changed

5 files changed

+33
-58
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.dfbf.soundlink.domain.user.exception;
2+
3+
public class CustomJwtException extends RuntimeException {
4+
public CustomJwtException(String message) {
5+
super(message);
6+
}
7+
8+
public CustomJwtException(String message, Throwable cause) {
9+
super(message, cause);
10+
}
11+
}

src/main/java/org/dfbf/soundlink/domain/user/exception/ExpiredTokenException.java

Lines changed: 0 additions & 7 deletions
This file was deleted.

src/main/java/org/dfbf/soundlink/domain/user/service/UserService.java

Lines changed: 6 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -312,35 +312,16 @@ public ResponseResult getProfile(String tag) {
312312
}
313313
}
314314

315-
// 토큰 재발급
315+
// 토큰 재발급(리프레시토큰만 가지고 재발급)
316316
public ResponseResult reissueToken(HttpServletRequest request, HttpServletResponse response) {
317-
String accessToken = jwtProvider.resolveAccessToken(request);
318-
String refreshToken = jwtProvider.resolveRefreshToken(request);
319-
320-
log.info("Old AccessToken: " + accessToken);
321-
log.info("Old RefreshToken: " + refreshToken);
322317

323-
// AccessToken과 RefreshToken이 모두 없는 경우
324-
if (accessToken == null && refreshToken == null) {
325-
logout(response,request);
326-
return new ResponseResult(ErrorCode.TOKEN_INVALID, "토큰이 존재하지 않거나 만료되었습니다.");
327-
}
328-
329-
if (accessToken == null) {
330-
logout(response,request);
331-
return new ResponseResult(ErrorCode.TOKEN_INVALID, "AT가 존재하지 않거나 만료되었습니다.");
332-
}
318+
String refreshToken = jwtProvider.resolveRefreshToken(request);
333319

334320
if (refreshToken == null) {
335321
logout(response,request);
336322
return new ResponseResult(ErrorCode.TOKEN_INVALID, "RT가 존재하지 않거나 만료되었습니다.");
337323
}
338324

339-
// AccessToken 유효성 확인
340-
if (jwtProvider.validateToken(accessToken)) {
341-
return new ResponseResult(ErrorCode.TOKEN_NOT_EXPIRED); // 유효한 액세스 토큰: 재발급 x
342-
}
343-
344325
// RefreshToken 유효성 확인
345326
if (jwtProvider.validateToken(refreshToken)) {
346327
Long userId = jwtProvider.getUserId(refreshToken);
@@ -353,15 +334,15 @@ public ResponseResult reissueToken(HttpServletRequest request, HttpServletRespon
353334
String newAccessToken = jwtProvider.createAccessToken(userId);
354335
String newRefreshToken = jwtProvider.createRefreshToken(userId);
355336

356-
log.info("New AccessToken: " + newAccessToken);
357-
log.info("New RefreshToken: " + newRefreshToken);
358-
359337
//레디스에 새로운 리프레시 토큰 업데이트!
360338
tokenService.updateRefreshToken(userId, newRefreshToken);
361339

340+
ResponseCookie refreshCookie = getRefreshToken(newRefreshToken);
341+
response.setHeader("Set-Cookie", refreshCookie.toString());
342+
362343
Map<String, String> responseBody = new HashMap<>();
363344
responseBody.put("accessToken", newAccessToken);
364-
response.setHeader("Set-Cookie", refreshToken);
345+
365346

366347
return new ResponseResult(ErrorCode.SUCCESS, responseBody);
367348
} else {

src/main/java/org/dfbf/soundlink/global/auth/JwtAuthenticationFilter.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,7 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse
3333
throw new JwtException("Invalid token");
3434
}
3535

36-
// 3. 만료 여부 검사
37-
if (jwtProvider.isTokenExpired(accessToken)) {
38-
throw new ExpiredJwtException(null, null, "Token expired");
39-
}
40-
41-
// 4. 유저정보 저장
36+
// 3. 유저정보 저장
4237
this.setAuthentication(accessToken);
4338
}
4439
filterChain.doFilter(request, response); // 필터 체인 진행(전달)

src/main/java/org/dfbf/soundlink/global/auth/JwtProvider.java

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import io.jsonwebtoken.security.Keys;
44
import jakarta.servlet.http.Cookie;
55
import jakarta.servlet.http.HttpServletRequest;
6+
import lombok.extern.slf4j.Slf4j;
7+
import org.dfbf.soundlink.domain.user.exception.CustomJwtException;
68
import org.springframework.beans.factory.annotation.Autowired;
79
import org.springframework.beans.factory.annotation.Value;
810
import org.springframework.data.redis.core.RedisTemplate;
@@ -13,6 +15,7 @@
1315
import java.util.Date;
1416
import java.util.concurrent.TimeUnit;
1517

18+
@Slf4j
1619
@Component
1720
public class JwtProvider {
1821

@@ -62,34 +65,26 @@ public String createRefreshToken(long userId) {
6265
}
6366

6467
//토큰 검증(변조, 만료, 올바른 형식)
65-
public boolean validateToken(String token){
68+
public boolean validateToken(String token) {
6669
try {
6770
Jwts.parserBuilder()
68-
.setSigningKey(SECRET_KEY) //서명 검증
71+
.setSigningKey(SECRET_KEY) // 서명 검증
6972
.build()
70-
.parseClaimsJws(token); //토큰 유효한지 확인.
73+
.parseClaimsJws(token); // 토큰 유효한지 확인 (여기서 만료 시간도 체크)
74+
75+
// 토큰이 유효한 경우
7176
return true;
77+
}catch (ExpiredJwtException e) {
78+
log.warn("[ERROR] Token is expired.");
79+
throw new CustomJwtException("토큰이 만료.", e);
80+
} catch (JwtException e) {
81+
log.warn("[ERROR] Token validation failed: {}", e.getMessage());
82+
throw new CustomJwtException("토큰 검증 실패", e);
7283
} catch (Exception e) {
73-
System.out.println("[ERROR] Token validation failed: ");
74-
return false;
75-
}
76-
}
77-
78-
public boolean isTokenExpired(String token) {
79-
try {
80-
Jwts.parserBuilder()
81-
.setSigningKey(SECRET_KEY)
82-
.build()
83-
.parseClaimsJws(token); // 만료된 토큰을 처리하려면 ExpiredJwtException이 발생함
84-
return false; // 만료되지 않으면 false
85-
} catch (ExpiredJwtException ex) {
86-
return true; // 만료된 경우 true
87-
} catch (Exception ex) {
88-
return false; // 다른 예외는 false
84+
throw new CustomJwtException("예기치 않은 오류 발생", e);
8985
}
9086
}
9187

92-
9388
//액세스토큰 추출
9489
public String resolveAccessToken(HttpServletRequest request) {
9590
String bearerToken = request.getHeader("Authorization"); //토큰을 헤더에 포함했는지

0 commit comments

Comments
 (0)