/login) // 로그인
@PostMapping("/login")
public ResponseEntity<?> login(@Valid @RequestBody LoginRequest request, HttpServletResponse res) {
// 로그인 수행 후 access + refresh 토큰 발급
Tokens tokens = authService.login(request.email(), request.password());
// refreshToken 쿠키 저장 (HttpOnly + Secure + SameSite 필요)
CookieUtil.addHttpOnlyCookie(res, "refreshToken", tokens.refreshToken(), 10080);
// accessToken 반환
return ResponseEntity.ok(Map.of("accessToken", tokens.accessToken()));
}
설명:
ApiException 발생 → 글로벌 핸들러에서 상태 코드 + 메시지 처리/refresh) // 토큰 갱신
@PostMapping("/refresh")
public ResponseEntity<?> refresh(HttpServletRequest req, HttpServletResponse res) {
// 요청 쿠키에서 refreshToken 읽기
String refreshToken = CookieUtil.readCookie(req, "refreshToken");
// 쿠키 자체가 없으면 = 비로그인 상태
if (refreshToken == null) {
// ApiException을 던져서 글로벌 핸들러에서 처리
throw new ApiException(ErrorCode.UNAUTHORIZED);
}
// refreshToken 유효하면 회전된 access + refresh 발급
Tokens tokens = authService.refresh(refreshToken);
// 새 refresh 쿠키 재설정
CookieUtil.addHttpOnlyCookie(res, "refreshToken", tokens.refreshToken(), 10080);
// 새로운 accessToken 반환
return ResponseEntity.ok(Map.of("accessToken", tokens.accessToken()));
}
설명:
401 UnauthorizedApiException → 글로벌 핸들러 처리