From 29d3dc945a3d8d23f0f976a78a50f3c2039c97df Mon Sep 17 00:00:00 2001 From: dungbik Date: Thu, 27 Nov 2025 19:04:23 +0900 Subject: [PATCH] =?UTF-8?q?Feat:=20AccessToken=20=EC=BF=A0=ED=82=A4?= =?UTF-8?q?=EC=97=90=20=EC=A0=80=EC=9E=A5=EB=90=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/controller/AuthController.java | 27 ++++++++++++++----- .../auth/controller/OAuthController.java | 2 +- .../controller/docs/AuthControllerDocs.java | 13 +++++---- .../controller/docs/OAuthControllerDocs.java | 2 +- .../filter/JwtAuthenticationFilter.java | 15 ++++++++--- .../common/security/jwt/JwtConstants.java | 4 +-- 6 files changed, 42 insertions(+), 21 deletions(-) diff --git a/src/main/java/project/flipnote/auth/controller/AuthController.java b/src/main/java/project/flipnote/auth/controller/AuthController.java index 04311d3d..45ebcbbd 100644 --- a/src/main/java/project/flipnote/auth/controller/AuthController.java +++ b/src/main/java/project/flipnote/auth/controller/AuthController.java @@ -23,11 +23,10 @@ import project.flipnote.auth.model.request.EmailVerifyRequest; import project.flipnote.auth.model.request.PasswordResetCreateRequest; import project.flipnote.auth.model.request.PasswordResetRequest; -import project.flipnote.auth.model.vo.TokenPair; import project.flipnote.auth.model.request.UserLoginRequest; -import project.flipnote.auth.model.response.UserLoginResponse; import project.flipnote.auth.model.request.UserRegisterRequest; import project.flipnote.auth.model.response.UserRegisterResponse; +import project.flipnote.auth.model.vo.TokenPair; import project.flipnote.auth.service.AuthService; import project.flipnote.common.security.dto.AuthPrinciple; import project.flipnote.common.security.jwt.JwtConstants; @@ -51,11 +50,18 @@ public ResponseEntity register(@Valid @RequestBody UserReg } @PostMapping("/login") - public ResponseEntity login( + public ResponseEntity login( @Valid @RequestBody UserLoginRequest req ) { TokenPair tokenPair = authService.login(req); + long accessTokenExpire = jwtProperties.getAccessTokenExpiration().toSeconds(); + ResponseCookie accessCookie = cookieUtil.createCookie( + JwtConstants.ACCESS_TOKEN, + tokenPair.accessToken(), + Math.toIntExact(accessTokenExpire) + ); + long expirationSeconds = jwtProperties.getRefreshTokenExpiration().toSeconds(); ResponseCookie cookie = cookieUtil.createCookie( JwtConstants.REFRESH_TOKEN, @@ -64,8 +70,9 @@ public ResponseEntity login( ); return ResponseEntity.ok() + .header(HttpHeaders.SET_COOKIE, accessCookie.toString()) .header(HttpHeaders.SET_COOKIE, cookie.toString()) - .body(UserLoginResponse.from(tokenPair.accessToken())); + .build(); } @PostMapping("/logout") @@ -94,11 +101,18 @@ public ResponseEntity verifyEmail( } @PostMapping("/token/refresh") - public ResponseEntity refreshToken( + public ResponseEntity refreshToken( @CookieValue(name = JwtConstants.REFRESH_TOKEN) String refreshToken ) { TokenPair tokenPair = authService.refreshToken(refreshToken); + long accessTokenExpire = jwtProperties.getAccessTokenExpiration().toSeconds(); + ResponseCookie accessCookie = cookieUtil.createCookie( + JwtConstants.ACCESS_TOKEN, + tokenPair.accessToken(), + Math.toIntExact(accessTokenExpire) + ); + long expirationSeconds = jwtProperties.getRefreshTokenExpiration().toSeconds(); ResponseCookie cookie = cookieUtil.createCookie( JwtConstants.REFRESH_TOKEN, @@ -107,8 +121,9 @@ public ResponseEntity refreshToken( ); return ResponseEntity.ok() + .header(HttpHeaders.SET_COOKIE, accessCookie.toString()) .header(HttpHeaders.SET_COOKIE, cookie.toString()) - .body(UserLoginResponse.from(tokenPair.accessToken())); + .build(); } @PostMapping("/password-reset/request") diff --git a/src/main/java/project/flipnote/auth/controller/OAuthController.java b/src/main/java/project/flipnote/auth/controller/OAuthController.java index 50d9bbd8..7559f953 100644 --- a/src/main/java/project/flipnote/auth/controller/OAuthController.java +++ b/src/main/java/project/flipnote/auth/controller/OAuthController.java @@ -42,7 +42,7 @@ public class OAuthController implements OAuthControllerDocs { private final CookieUtil cookieUtil; @GetMapping("/oauth2/authorization/{provider}") - public ResponseEntity redirectToProviderAuthorization( + public ResponseEntity redirectToProviderAuthorization( @PathVariable("provider") String provider, HttpServletRequest request, @AuthenticationPrincipal AuthPrinciple userAuth diff --git a/src/main/java/project/flipnote/auth/controller/docs/AuthControllerDocs.java b/src/main/java/project/flipnote/auth/controller/docs/AuthControllerDocs.java index 9e132693..cee789af 100644 --- a/src/main/java/project/flipnote/auth/controller/docs/AuthControllerDocs.java +++ b/src/main/java/project/flipnote/auth/controller/docs/AuthControllerDocs.java @@ -10,7 +10,6 @@ import project.flipnote.auth.model.request.PasswordResetCreateRequest; import project.flipnote.auth.model.request.PasswordResetRequest; import project.flipnote.auth.model.request.UserLoginRequest; -import project.flipnote.auth.model.response.UserLoginResponse; import project.flipnote.auth.model.request.UserRegisterRequest; import project.flipnote.auth.model.response.UserRegisterResponse; import project.flipnote.common.security.dto.AuthPrinciple; @@ -22,9 +21,9 @@ public interface AuthControllerDocs { ResponseEntity register(UserRegisterRequest req); @Operation(summary = "로그인") - ResponseEntity login(UserLoginRequest req); + ResponseEntity login(UserLoginRequest req); - @Operation(summary = "로그아웃", security = { @SecurityRequirement(name = "access-token") }) + @Operation(summary = "로그아웃", security = {@SecurityRequirement(name = "access-token")}) ResponseEntity logout(); @Operation(summary = "이메일 인증번호 전송") @@ -34,7 +33,7 @@ public interface AuthControllerDocs { ResponseEntity verifyEmail(EmailVerifyRequest req); @Operation(summary = "토큰 갱신") - ResponseEntity refreshToken(String refreshToken); + ResponseEntity refreshToken(String refreshToken); @Operation(summary = "비밀번호 재설정 링크 전송") ResponseEntity requestPasswordReset(PasswordResetCreateRequest req); @@ -42,12 +41,12 @@ public interface AuthControllerDocs { @Operation(summary = "비밀번호 재설정") ResponseEntity resetPassword(PasswordResetRequest req); - @Operation(summary = "내 비밀번호 변경", security = { @SecurityRequirement(name = "access-token") }) + @Operation(summary = "내 비밀번호 변경", security = {@SecurityRequirement(name = "access-token")}) ResponseEntity updatePassword(AuthPrinciple userAuth, ChangePasswordRequest req); - @Operation(summary = "내 소셜 연동 계정 목록 조회", security = { @SecurityRequirement(name = "access-token") }) + @Operation(summary = "내 소셜 연동 계정 목록 조회", security = {@SecurityRequirement(name = "access-token")}) ResponseEntity getSocialLinks(AuthPrinciple userAuth); - @Operation(summary = "소셜 연동 해제", security = { @SecurityRequirement(name = "access-token") }) + @Operation(summary = "소셜 연동 해제", security = {@SecurityRequirement(name = "access-token")}) ResponseEntity deleteSocialLink(AuthPrinciple userAuth, Long socialLinkId); } diff --git a/src/main/java/project/flipnote/auth/controller/docs/OAuthControllerDocs.java b/src/main/java/project/flipnote/auth/controller/docs/OAuthControllerDocs.java index 34f886bb..4ea93036 100644 --- a/src/main/java/project/flipnote/auth/controller/docs/OAuthControllerDocs.java +++ b/src/main/java/project/flipnote/auth/controller/docs/OAuthControllerDocs.java @@ -11,7 +11,7 @@ public interface OAuthControllerDocs { @Operation(summary = "소셜 인증 URL로 리다이렉트") - ResponseEntity redirectToProviderAuthorization( + ResponseEntity redirectToProviderAuthorization( String provider, HttpServletRequest request, AuthPrinciple userAuth diff --git a/src/main/java/project/flipnote/common/security/filter/JwtAuthenticationFilter.java b/src/main/java/project/flipnote/common/security/filter/JwtAuthenticationFilter.java index c4d92b8a..1a8187a8 100644 --- a/src/main/java/project/flipnote/common/security/filter/JwtAuthenticationFilter.java +++ b/src/main/java/project/flipnote/common/security/filter/JwtAuthenticationFilter.java @@ -11,6 +11,7 @@ import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; +import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; @@ -33,6 +34,7 @@ protected void doFilterInternal( FilterChain filterChain ) throws ServletException, IOException { String token = extractToken(request); + System.out.println(token); if (StringUtils.hasText(token)) { AuthPrinciple userAuth = jwtComponent.extractUserAuthFromToken(token); @@ -45,9 +47,16 @@ protected void doFilterInternal( } private String extractToken(HttpServletRequest request) { - String bearerToken = request.getHeader(JwtConstants.AUTH_HEADER); - if (StringUtils.hasText(bearerToken) && bearerToken.startsWith(JwtConstants.TOKEN_PREFIX)) { - return bearerToken.substring(JwtConstants.TOKEN_PREFIX.length()); + Cookie[] cookies = request.getCookies(); + if (cookies != null) { + for (Cookie cookie : cookies) { + if (JwtConstants.ACCESS_TOKEN.equals(cookie.getName())) { + String token = cookie.getValue(); + if (StringUtils.hasText(token)) { + return token; + } + } + } } return null; } diff --git a/src/main/java/project/flipnote/common/security/jwt/JwtConstants.java b/src/main/java/project/flipnote/common/security/jwt/JwtConstants.java index ae75c51e..e4b8bbdd 100644 --- a/src/main/java/project/flipnote/common/security/jwt/JwtConstants.java +++ b/src/main/java/project/flipnote/common/security/jwt/JwtConstants.java @@ -6,13 +6,11 @@ @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class JwtConstants { + public static final String ACCESS_TOKEN = "accessToken"; public static final String REFRESH_TOKEN = "refreshToken"; public static final String ROLE = "role"; public static final String TOKEN_VERSION = "token_version"; public static final String AUTH_ID = "auth_id"; public static final String USER_ID = "user_id"; - - public static final String AUTH_HEADER = "Authorization"; - public static final String TOKEN_PREFIX = "Bearer "; }