Skip to content

Commit 14be983

Browse files
authored
Merge pull request #273 from asowjdan/fix/member
Fix[member]:쿠키 유효시간 수정 및 쿠키 생성 도메인 수정
2 parents 49e4e26 + 0d0cdec commit 14be983

File tree

6 files changed

+38
-10
lines changed

6 files changed

+38
-10
lines changed

backend/.env.default

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,3 +77,5 @@ CUSTOM_CORS_ALLOWED_ORIGINS=NEED_TO_SET
7777
CUSTOM_OAUTH2_REDIRECT_URL=NEED_TO_SET
7878
CUSTOM_OAUTH2_FAILURE_URL=NEED_TO_SET
7979
CUSTOM_FRONTEND_URL=NEED_TO_SET
80+
PROD_COOKIE_DOMAIN=NEED_TO_SET
81+
DEV_COOKIE_DOMAIN=NEED_TO_SET

backend/src/main/java/com/ai/lawyer/global/jwt/CookieUtil.java

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,14 @@
33
import jakarta.servlet.http.Cookie;
44
import jakarta.servlet.http.HttpServletRequest;
55
import jakarta.servlet.http.HttpServletResponse;
6+
import lombok.extern.slf4j.Slf4j;
7+
import org.springframework.beans.factory.annotation.Value;
68
import org.springframework.http.ResponseCookie;
79
import org.springframework.stereotype.Component;
810

911
import java.time.Duration;
1012

13+
@Slf4j
1114
@Component
1215
public class CookieUtil {
1316

@@ -18,7 +21,7 @@ public class CookieUtil {
1821
// 쿠키 만료 시간 상수 (초 단위)
1922
private static final int MINUTES_PER_HOUR = 60;
2023
private static final int HOURS_PER_DAY = 24;
21-
private static final int ACCESS_TOKEN_EXPIRE_TIME = 5 * 60; // 5분 (300초)
24+
private static final int ACCESS_TOKEN_EXPIRE_TIME = 60 * 60; // 5분 (300초)
2225
private static final int REFRESH_TOKEN_EXPIRE_TIME = 7 * HOURS_PER_DAY * MINUTES_PER_HOUR * 60; // 7일
2326

2427
// 쿠키 보안 설정 상수
@@ -28,6 +31,9 @@ public class CookieUtil {
2831
private static final String SAME_SITE = "Lax"; // Lax: 같은 사이트 요청에서 쿠키 전송 허용
2932
private static final int COOKIE_EXPIRE_IMMEDIATELY = 0;
3033

34+
@Value("${custom.cookie.domain:}")
35+
private String cookieDomain;
36+
3137
public void setTokenCookies(HttpServletResponse response, String accessToken, String refreshToken) {
3238
setAccessTokenCookie(response, accessToken);
3339
setRefreshTokenCookie(response, refreshToken);
@@ -52,13 +58,27 @@ public void clearTokenCookies(HttpServletResponse response) {
5258
* ResponseCookie를 생성합니다 (SameSite 지원).
5359
*/
5460
private ResponseCookie createResponseCookie(String name, String value, int maxAge) {
55-
return ResponseCookie.from(name, value)
61+
log.debug("=== 쿠키 생성 중: name={}, cookieDomain='{}', isEmpty={}",
62+
name, cookieDomain, cookieDomain == null || cookieDomain.isEmpty());
63+
64+
ResponseCookie.ResponseCookieBuilder builder = ResponseCookie.from(name, value)
5665
.httpOnly(HTTP_ONLY)
5766
.secure(SECURE_IN_PRODUCTION)
5867
.path(COOKIE_PATH)
5968
.maxAge(Duration.ofSeconds(maxAge))
60-
.sameSite(SAME_SITE)
61-
.build();
69+
.sameSite(SAME_SITE);
70+
71+
// 도메인이 설정되어 있으면 추가
72+
if (cookieDomain != null && !cookieDomain.isEmpty()) {
73+
log.debug("쿠키 도메인 설정: {}", cookieDomain);
74+
builder.domain(cookieDomain);
75+
} else {
76+
log.debug("쿠키 도메인 설정 안 함 (빈 값 또는 null)");
77+
}
78+
79+
ResponseCookie cookie = builder.build();
80+
log.debug("생성된 쿠키: {}", cookie);
81+
return cookie;
6282
}
6383

6484
/**

backend/src/main/resources/application-dev.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,3 +70,5 @@ custom:
7070
failure-url: ${DEV_OAUTH2_FAILURE_REDIRECT_URL}
7171
frontend:
7272
url: ${DEV_FRONTEND_URL}
73+
cookie:
74+
domain: ${DEV_COOKIE_DOMAIN}

backend/src/main/resources/application-prod.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ custom:
8181
failure-url: ${PROD_OAUTH2_FAILURE_REDIRECT_URL}
8282
frontend:
8383
url: ${PROD_FRONTEND_URL}
84+
cookie:
85+
domain: ${PROD_COOKIE_DOMAIN:.trybalaw.com} # 운영환경: 모든 서브도메인에서 쿠키 공유
8486

8587
sentry:
8688
dsn: ${PROD_SENTRY_DSN}

backend/src/main/resources/application.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,3 +155,5 @@ custom:
155155
failure-url: ${CUSTOM_OAUTH2_FAILURE_URL}
156156
frontend:
157157
url: ${CUSTOM_FRONTEND_URL}
158+
cookie:
159+
domain:

backend/src/test/java/com/ai/lawyer/global/jwt/CookieUtilTest.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ void setTokenCookies_Success() {
7070
assertThat(accessCookieHeader).contains(ACCESS_TOKEN_NAME + "=" + ACCESS_TOKEN);
7171
assertThat(accessCookieHeader).contains("HttpOnly");
7272
assertThat(accessCookieHeader).contains("Path=/");
73-
assertThat(accessCookieHeader).contains("Max-Age=300"); // 5분 = 300초
73+
assertThat(accessCookieHeader).contains("Max-Age=3600"); // 1시간 = 3600초
7474
assertThat(accessCookieHeader).contains("SameSite=Lax");
7575
log.info("액세스 토큰 쿠키 검증 완료: {}", accessCookieHeader);
7676

@@ -102,7 +102,7 @@ void setAccessTokenCookie_Success() {
102102
String cookieHeader = headerCaptor.getValue();
103103
assertThat(cookieHeader).contains(ACCESS_TOKEN_NAME + "=" + ACCESS_TOKEN);
104104
assertThat(cookieHeader).contains("HttpOnly");
105-
assertThat(cookieHeader).contains("Max-Age=300");
105+
assertThat(cookieHeader).contains("Max-Age=3600");
106106
assertThat(cookieHeader).contains("SameSite=Lax");
107107
log.info("=== 액세스 토큰 단독 쿠키 설정 테스트 완료 ===");
108108
}
@@ -304,11 +304,11 @@ void cookiePathAttribute_Accessibility() {
304304
}
305305

306306
@Test
307-
@DisplayName("토큰 만료 시간 확인 - 액세스 5분, 리프레시 7일")
307+
@DisplayName("토큰 만료 시간 확인 - 액세스 1시간, 리프레시 7일")
308308
void cookieMaxAgeAttribute_ExpiryTime() {
309309
// given
310310
log.info("=== 토큰 만료 시간 테스트 시작 ===");
311-
log.info("액세스 토큰 만료: 5분 (300초)");
311+
log.info("액세스 토큰 만료: 1시간 (3600초)");
312312
log.info("리프레시 토큰 만료: 7일 (604800초)");
313313

314314
// when
@@ -321,8 +321,8 @@ void cookieMaxAgeAttribute_ExpiryTime() {
321321
var setCookieHeaders = headerCaptor.getAllValues();
322322

323323
String accessHeader = setCookieHeaders.getFirst();
324-
assertThat(accessHeader).contains("Max-Age=300");
325-
log.info("액세스 토큰 만료 시간: 300초 (5분)");
324+
assertThat(accessHeader).contains("Max-Age=3600");
325+
log.info("액세스 토큰 만료 시간: 3600초 (1시간)");
326326

327327
String refreshHeader = setCookieHeaders.get(1);
328328
assertThat(refreshHeader).contains("Max-Age=604800");

0 commit comments

Comments
 (0)