Skip to content

Commit d85576d

Browse files
authored
refactor: 리프레시 토큰 만료시 쿠키 삭제 (#628)
* refactor: 리프레시 토큰 만료시 쿠키 삭제 * refactor: 인증 전용 예외 생성
1 parent b4d6ec2 commit d85576d

File tree

6 files changed

+50
-10
lines changed

6 files changed

+50
-10
lines changed

src/main/java/com/example/solidconnection/auth/controller/AuthController.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,9 +117,7 @@ public ResponseEntity<Void> quit(
117117
}
118118

119119
@PostMapping("/reissue")
120-
public ResponseEntity<ReissueResponse> reissueToken(
121-
HttpServletRequest request
122-
) {
120+
public ResponseEntity<ReissueResponse> reissueToken(HttpServletRequest request) {
123121
String refreshToken = refreshTokenCookieManager.getRefreshToken(request);
124122
ReissueResponse reissueResponse = authService.reissue(refreshToken);
125123
return ResponseEntity.ok(reissueResponse);
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.example.solidconnection.auth.exception;
2+
3+
import com.example.solidconnection.common.exception.CustomException;
4+
import com.example.solidconnection.common.exception.ErrorCode;
5+
6+
public class AuthException extends CustomException {
7+
8+
public AuthException(ErrorCode errorCode) {
9+
super(errorCode);
10+
}
11+
12+
public AuthException(ErrorCode errorCode, String detail) {
13+
super(errorCode, detail);
14+
}
15+
}

src/main/java/com/example/solidconnection/auth/service/AuthService.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import com.example.solidconnection.auth.domain.AccessToken;
77
import com.example.solidconnection.auth.dto.ReissueResponse;
8+
import com.example.solidconnection.auth.exception.AuthException;
89
import com.example.solidconnection.auth.token.TokenBlackListService;
910
import com.example.solidconnection.common.exception.CustomException;
1011
import com.example.solidconnection.siteuser.domain.SiteUser;
@@ -55,7 +56,7 @@ public void quit(long siteUserId, String token) {
5556
public ReissueResponse reissue(String requestedRefreshToken) {
5657
// 리프레시 토큰 확인
5758
if (!authTokenProvider.isValidRefreshToken(requestedRefreshToken)) {
58-
throw new CustomException(REFRESH_TOKEN_EXPIRED);
59+
throw new AuthException(REFRESH_TOKEN_EXPIRED);
5960
}
6061
// 액세스 토큰 재발급
6162
SiteUser siteUser = authTokenProvider.parseSiteUser(requestedRefreshToken);

src/main/java/com/example/solidconnection/common/exception/CustomException.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,19 @@
55
@Getter
66
public class CustomException extends RuntimeException {
77

8+
private final ErrorCode errorCode;
89
private final int code;
910
private final String message;
1011

1112
public CustomException(ErrorCode errorCode) {
12-
code = errorCode.getCode();
13-
message = errorCode.getMessage();
13+
this.errorCode = errorCode;
14+
this.code = errorCode.getCode();
15+
this.message = errorCode.getMessage();
1416
}
1517

1618
public CustomException(ErrorCode errorCode, String detail) {
17-
code = errorCode.getCode();
18-
message = errorCode.getMessage() + " : " + detail;
19+
this.errorCode = errorCode;
20+
this.code = errorCode.getCode();
21+
this.message = errorCode.getMessage() + " : " + detail;
1922
}
2023
}

src/main/java/com/example/solidconnection/common/exception/CustomExceptionHandler.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,17 @@
55
import static com.example.solidconnection.common.exception.ErrorCode.JSON_PARSING_FAILED;
66
import static com.example.solidconnection.common.exception.ErrorCode.JWT_EXCEPTION;
77
import static com.example.solidconnection.common.exception.ErrorCode.NOT_DEFINED_ERROR;
8+
import static com.example.solidconnection.common.exception.ErrorCode.REFRESH_TOKEN_EXPIRED;
89

10+
import com.example.solidconnection.auth.controller.RefreshTokenCookieManager;
11+
import com.example.solidconnection.auth.exception.AuthException;
912
import com.example.solidconnection.common.response.ErrorResponse;
1013
import com.fasterxml.jackson.databind.exc.InvalidFormatException;
1114
import io.jsonwebtoken.JwtException;
15+
import jakarta.servlet.http.HttpServletResponse;
1216
import java.util.ArrayList;
1317
import java.util.List;
18+
import lombok.RequiredArgsConstructor;
1419
import lombok.extern.slf4j.Slf4j;
1520
import org.springframework.dao.DataIntegrityViolationException;
1621
import org.springframework.http.HttpStatus;
@@ -21,8 +26,26 @@
2126

2227
@Slf4j
2328
@ControllerAdvice
29+
@RequiredArgsConstructor
2430
public class CustomExceptionHandler {
2531

32+
private final RefreshTokenCookieManager refreshTokenCookieManager;
33+
34+
@ExceptionHandler(AuthException.class)
35+
protected ResponseEntity<ErrorResponse> handleAuthException(
36+
AuthException ex,
37+
HttpServletResponse response
38+
) {
39+
log.error("인증 예외 발생 : {}", ex.getMessage());
40+
if (ex.getErrorCode().equals(REFRESH_TOKEN_EXPIRED)) {
41+
refreshTokenCookieManager.deleteCookie(response);
42+
}
43+
ErrorResponse errorResponse = new ErrorResponse(ex);
44+
return ResponseEntity
45+
.status(ex.getCode())
46+
.body(errorResponse);
47+
}
48+
2649
@ExceptionHandler(CustomException.class)
2750
protected ResponseEntity<ErrorResponse> handleCustomException(CustomException ex) {
2851
log.error("커스텀 예외 발생 : {}", ex.getMessage());

src/test/java/com/example/solidconnection/auth/service/AuthServiceTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
import com.example.solidconnection.auth.domain.RefreshToken;
1010
import com.example.solidconnection.auth.domain.Subject;
1111
import com.example.solidconnection.auth.dto.ReissueResponse;
12+
import com.example.solidconnection.auth.exception.AuthException;
1213
import com.example.solidconnection.auth.token.TokenBlackListService;
13-
import com.example.solidconnection.common.exception.CustomException;
1414
import com.example.solidconnection.siteuser.domain.SiteUser;
1515
import com.example.solidconnection.siteuser.fixture.SiteUserFixture;
1616
import com.example.solidconnection.siteuser.repository.SiteUserRepository;
@@ -109,7 +109,7 @@ class 토큰을_재발급한다 {
109109

110110
// when, then
111111
assertThatCode(() -> authService.reissue(invalidRefreshToken))
112-
.isInstanceOf(CustomException.class)
112+
.isInstanceOf(AuthException.class)
113113
.hasMessage(REFRESH_TOKEN_EXPIRED.getMessage());
114114
}
115115
}

0 commit comments

Comments
 (0)