Skip to content

Commit 4a25edf

Browse files
committed
[FIX] 소셜 로그인 쿠키 관련 로직 수정
1 parent f34c336 commit 4a25edf

4 files changed

Lines changed: 21 additions & 32 deletions

File tree

src/main/java/com/example/be/apiPayload/exception/handler/OAuthLoginSuccessHandler.java

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import com.example.be.repository.redis.RedisRefreshTokenRepository;
1010
import com.example.be.repository.UserRepository;
1111
import com.example.be.service.JwtUtilServiceImpl;
12-
import jakarta.servlet.http.Cookie;
1312
import jakarta.servlet.http.HttpServletRequest;
1413
import jakarta.servlet.http.HttpServletResponse;
1514
import lombok.RequiredArgsConstructor;
@@ -21,7 +20,6 @@
2120
import org.springframework.stereotype.Component;
2221

2322
import java.io.IOException;
24-
import java.net.URLEncoder;
2523
import java.time.LocalDateTime;
2624
import java.util.Map;
2725
import java.util.UUID;
@@ -113,25 +111,15 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo
113111
// 액세스 토큰 발급
114112
String accessToken = jwtUtil.generateAccessToken(user.getUserId(), ACCESS_TOKEN_EXPIRATION_TIME);
115113

116-
// 쿠키에 액세스 토큰 추가
117-
Cookie accessTokenCookie = new Cookie("accessToken", accessToken);
118-
accessTokenCookie.setHttpOnly(true); // JavaScript에서 접근 불가능하게 설정
119-
accessTokenCookie.setSecure(true); // HTTPS에서만 전송되도록 설정
120-
accessTokenCookie.setPath("/"); // 모든 경로에서 쿠키 접근 가능
121-
accessTokenCookie.setDomain(".studylink.store"); // 서브도메인 간 쿠키 공유
122-
accessTokenCookie.setMaxAge((int) (ACCESS_TOKEN_EXPIRATION_TIME / 1000)); // 밀리초를 초로 변환
123-
response.addCookie(accessTokenCookie);
124-
125-
126-
// 쿠키에 리프레시 토큰 추가
127-
Cookie refreshTokenCookie = new Cookie("refreshToken", refreshToken);
128-
refreshTokenCookie.setHttpOnly(true);
129-
refreshTokenCookie.setSecure(true);
130-
refreshTokenCookie.setPath("/");
131-
refreshTokenCookie.setDomain(".studylink.store"); // 서브도메인 간 쿠키 공유
132-
refreshTokenCookie.setMaxAge((int) (REFRESH_TOKEN_EXPIRATION_TIME / 1000));
133-
response.addCookie(refreshTokenCookie);
134-
response.sendRedirect(REDIRECT_URI+provider);
114+
// Set-Cookie 헤더로 쿠키 설정 (Domain, SameSite 포함)
115+
response.addHeader("Set-Cookie",
116+
String.format("accessToken=%s; Path=/; Domain=.studylink.store; Max-Age=%d; HttpOnly; Secure; SameSite=None",
117+
accessToken, (int) (ACCESS_TOKEN_EXPIRATION_TIME / 1000)));
118+
response.addHeader("Set-Cookie",
119+
String.format("refreshToken=%s; Path=/; Domain=.studylink.store; Max-Age=%d; HttpOnly; Secure; SameSite=None",
120+
refreshToken, (int) (REFRESH_TOKEN_EXPIRATION_TIME / 1000)));
121+
122+
response.sendRedirect(REDIRECT_URI + provider);
135123

136124
// // 이름, 액세스 토큰, 리프레쉬 토큰을 담아 리다이렉트
137125
// String encodedName = URLEncoder.encode(name, "UTF-8");

src/main/java/com/example/be/service/TokenServiceImpl.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
import com.example.be.domain.redis.RedisRefreshToken;
77
import com.example.be.repository.redis.RedisRefreshTokenRepository;
88
import com.example.be.web.dto.TokenResponseDTO;
9+
import jakarta.servlet.http.HttpServletRequest;
910
import lombok.RequiredArgsConstructor;
1011
import org.springframework.beans.factory.annotation.Value;
11-
import org.springframework.security.core.token.TokenService;
1212
import org.springframework.stereotype.Service;
1313

1414
import java.util.UUID;
@@ -24,8 +24,12 @@ public class TokenServiceImpl{
2424

2525

2626
//액세스 토큰 재발급
27-
public TokenResponseDTO reissueAccessToken(String authorizationHeader) {
28-
String refreshToken = jwtUtil.getTokenFromHeader(authorizationHeader);
27+
public TokenResponseDTO reissueAccessToken(HttpServletRequest request) {
28+
// 쿠키에서 refreshToken 추출
29+
String refreshToken = jwtUtil.extractTokenFromCookie(request, "refreshToken");
30+
if (refreshToken == null) {
31+
throw new TokenException(TokenErrorResult.INVALID_REFRESH_TOKEN);
32+
}
2933
String userId = jwtUtil.getUserIdFromToken(refreshToken);
3034

3135
// Redis에서 RefreshToken 조회

src/main/java/com/example/be/service/UserServiceImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,9 +149,9 @@ public CommonDTO.IsSuccessDTO logout(HttpServletResponse response, HttpServletRe
149149
throw new UserHandler(ErrorStatus._NOT_FOUND_COOKIE);
150150
}
151151
response.addHeader("Set-Cookie",
152-
"accessToken=; Path=/; Domain=.studylink.store; Max-Age=0; HttpOnly; Secure; SameSite=None");
152+
"accessToken=; Path=/; Max-Age=0; HttpOnly; Secure; SameSite=None");
153153
response.addHeader("Set-Cookie",
154-
"refreshToken=; Path=/; Domain=.studylink.store; Max-Age=0; HttpOnly; Secure; SameSite=None");
154+
"refreshToken=; Path=/; Max-Age=0; HttpOnly; Secure; SameSite=None");
155155

156156
return CommonDTO.IsSuccessDTO.builder().isSuccess(true).build();
157157
}

src/main/java/com/example/be/web/controller/TokenController.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,10 @@
66
import com.example.be.service.TokenServiceImpl;
77
import com.example.be.web.dto.TokenResponseDTO;
88
import io.swagger.v3.oas.annotations.Operation;
9-
import io.swagger.v3.oas.annotations.Parameter;
9+
import jakarta.servlet.http.HttpServletRequest;
1010
import lombok.RequiredArgsConstructor;
1111
import org.springframework.http.ResponseEntity;
1212
import org.springframework.web.bind.annotation.GetMapping;
13-
import org.springframework.web.bind.annotation.RequestHeader;
1413
import org.springframework.web.bind.annotation.RequestMapping;
1514
import org.springframework.web.bind.annotation.RestController;
1615

@@ -25,10 +24,8 @@ public class TokenController {
2524
// 액세스 토큰을 재발행하는 API
2625
@GetMapping("/reissue/access-token")
2726
@Operation(summary = "액세스 토큰 재발행 API")
28-
public ResponseEntity<ApiResponse<Object>> reissueAccessToken(
29-
@Parameter(hidden = true) @RequestHeader("Authorization") String authorizationHeader) {
30-
31-
TokenResponseDTO accessToken = authService.reissueAccessToken(authorizationHeader);
27+
public ResponseEntity<ApiResponse<Object>> reissueAccessToken(HttpServletRequest request) {
28+
TokenResponseDTO accessToken = authService.reissueAccessToken(request);
3229
return ApiResponse.onSuccess(SuccessStatus._CREATED_ACCESS_TOKEN, accessToken);
3330
}
3431
}

0 commit comments

Comments
 (0)