11package com .WhoIsRoom .WhoIs_Server .domain .auth .service ;
22
3+ import com .WhoIsRoom .WhoIs_Server .domain .auth .dto .request .RefreshTokenRequest ;
4+ import com .WhoIsRoom .WhoIs_Server .domain .auth .dto .response .LoginResponse ;
5+ import com .WhoIsRoom .WhoIs_Server .domain .auth .dto .response .ReissueResponse ;
36import com .WhoIsRoom .WhoIs_Server .domain .auth .exception .CustomAuthenticationException ;
47import com .WhoIsRoom .WhoIs_Server .domain .auth .exception .CustomJwtException ;
58import com .WhoIsRoom .WhoIs_Server .domain .auth .util .JwtUtil ;
69import com .WhoIsRoom .WhoIs_Server .global .common .redis .RedisService ;
10+ import com .WhoIsRoom .WhoIs_Server .global .common .response .BaseResponse ;
711import com .WhoIsRoom .WhoIs_Server .global .common .response .ErrorCode ;
12+ import com .fasterxml .jackson .databind .ObjectMapper ;
813import jakarta .servlet .http .HttpServletRequest ;
914import jakarta .servlet .http .HttpServletResponse ;
1015import lombok .RequiredArgsConstructor ;
1116import lombok .extern .slf4j .Slf4j ;
1217import org .springframework .beans .factory .annotation .Value ;
18+ import org .springframework .http .MediaType ;
1319import org .springframework .stereotype .Service ;
1420
21+ import java .io .IOException ;
1522import java .time .Duration ;
1623
1724@ Slf4j
@@ -37,27 +44,30 @@ public class JwtService {
3744
3845 private final RedisService redisService ;
3946 private final JwtUtil jwtUtil ;
47+ private final ObjectMapper objectMapper ;
4048
41- public void logout (HttpServletRequest request ) {
49+ public void logout (HttpServletRequest request , RefreshTokenRequest tokenRequest ) {
4250 String accessToken = jwtUtil .extractAccessToken (request )
4351 .orElseThrow (() -> new CustomAuthenticationException (ErrorCode .SECURITY_INVALID_ACCESS_TOKEN ));
44- String refreshToken = jwtUtil .extractRefreshToken (request )
45- .orElseThrow (() -> new CustomAuthenticationException (ErrorCode .SECURITY_INVALID_REFRESH_TOKEN ));
52+
53+ String refreshToken = tokenRequest .getRefreshToken ();
54+ jwtUtil .validateToken (refreshToken );
55+ if (!"refresh" .equals (jwtUtil .getTokenType (refreshToken ))) {
56+ throw new CustomJwtException (ErrorCode .INVALID_TOKEN_TYPE );
57+ }
4658
4759 deleteRefreshToken (refreshToken );
4860 //access token blacklist 처리 -> 로그아웃한 사용자가 요청 시 access token이 redis에 존재하면 jwtAuthenticationFilter에서 인증처리 거부
4961 invalidAccessToken (accessToken );
5062 }
5163
52- public void reissueTokens (HttpServletRequest request , HttpServletResponse response ) {
53- String refreshToken = jwtUtil .extractRefreshToken (request )
54- .orElseThrow (() -> new CustomAuthenticationException (ErrorCode .SECURITY_INVALID_REFRESH_TOKEN ));
55-
64+ public ReissueResponse reissueTokens (RefreshTokenRequest tokenRequest ) {
65+ String refreshToken = tokenRequest .getRefreshToken ();
5666 jwtUtil .validateToken (refreshToken );
5767 if (!"refresh" .equals (jwtUtil .getTokenType (refreshToken ))) {
5868 throw new CustomJwtException (ErrorCode .INVALID_TOKEN_TYPE );
5969 }
60- reissueAndSendTokens (response , refreshToken );
70+ return reissueAndSendTokens (refreshToken );
6171 }
6272
6373 public void checkLogout (String accessToken ) {
@@ -83,7 +93,7 @@ private void invalidAccessToken(String accessToken) {
8393 Duration .ofMillis (ACCESS_TOKEN_EXPIRED_IN ));
8494 }
8595
86- private void reissueAndSendTokens (HttpServletResponse response , String refreshToken ) {
96+ private ReissueResponse reissueAndSendTokens (String refreshToken ) {
8797
8898 // 새로운 Refresh Token 발급
8999 String reissuedAccessToken = jwtUtil .createAccessToken (jwtUtil .getUserId (refreshToken ), jwtUtil .getProviderId (refreshToken ), jwtUtil .getRole (refreshToken ), jwtUtil .getName (refreshToken ));
@@ -95,12 +105,9 @@ private void reissueAndSendTokens(HttpServletResponse response, String refreshTo
95105 // 기존 Refresh Token 폐기 (DB나 Redis에서 삭제)
96106 deleteRefreshToken (refreshToken );
97107
98- sendTokens (response , reissuedAccessToken , reissuedRefreshToken );
99- }
100-
101- public void sendTokens (HttpServletResponse response , String accessToken ,
102- String refreshToken ) {
103- response .setHeader (ACCESS_HEADER , BEARER_PREFIX + accessToken );
104- response .setHeader (REFRESH_HEADER , BEARER_PREFIX + refreshToken );
108+ return ReissueResponse .builder ()
109+ .accessToken (reissuedAccessToken )
110+ .refreshToken (reissuedRefreshToken )
111+ .build ();
105112 }
106113}
0 commit comments