From fb7385f679239069f1cf27ae33d5b2f8d3888859 Mon Sep 17 00:00:00 2001 From: nayonsoso Date: Thu, 14 Aug 2025 07:06:41 +0900 Subject: [PATCH 1/5] =?UTF-8?q?chore:=20=EC=A3=BC=EC=84=9D=20=EA=B0=80?= =?UTF-8?q?=EB=8F=85=EC=84=B1=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/controller/RefreshTokenCookieManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/solidconnection/auth/controller/RefreshTokenCookieManager.java b/src/main/java/com/example/solidconnection/auth/controller/RefreshTokenCookieManager.java index 81bc45461..f51ca93cb 100644 --- a/src/main/java/com/example/solidconnection/auth/controller/RefreshTokenCookieManager.java +++ b/src/main/java/com/example/solidconnection/auth/controller/RefreshTokenCookieManager.java @@ -19,7 +19,7 @@ public void setCookie(HttpServletResponse response, String refreshToken) { } private long convertExpireTimeToCookieMaxAge(long milliSeconds) { - // jwt의 expireTime: millisecond, cookie의 maxAge: second + // jwt의 expireTime 단위인 millisecond를 cookie의 maxAge 단위인 second로 변환 return milliSeconds / 1000; } From 86319eb201287197a28d658f25e6740297223fa1 Mon Sep 17 00:00:00 2001 From: nayonsoso Date: Thu, 14 Aug 2025 07:08:49 +0900 Subject: [PATCH 2/5] =?UTF-8?q?chore:=20=EC=BF=A0=ED=82=A4=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=ED=99=98=EA=B2=BD=EB=B3=80=EC=88=98=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/resources/application.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml index 7abc6949f..ce5a848cb 100644 --- a/src/test/resources/application.yml +++ b/src/test/resources/application.yml @@ -85,3 +85,6 @@ cors: - "http://localhost:8080" news: default-thumbnail-url: "default-thumbnail-url" +token: + refresh: + cookie-domain: "test.domain.com" From 0bdc76f1ad3f7bf0302f404e891df368526c08fb Mon Sep 17 00:00:00 2001 From: nayonsoso Date: Thu, 14 Aug 2025 07:10:01 +0900 Subject: [PATCH 3/5] =?UTF-8?q?feat:=20=EB=A6=AC=ED=94=84=EB=A0=88?= =?UTF-8?q?=EC=8B=9C=20=ED=86=A0=ED=81=B0=20=EC=84=A4=EC=A0=95=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/RefreshTokenCookieProperties.java | 21 +++++++++++ .../RefreshTokenCookiePropertiesTest.java | 35 +++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 src/main/java/com/example/solidconnection/auth/controller/config/RefreshTokenCookieProperties.java create mode 100644 src/test/java/com/example/solidconnection/auth/controller/config/RefreshTokenCookiePropertiesTest.java diff --git a/src/main/java/com/example/solidconnection/auth/controller/config/RefreshTokenCookieProperties.java b/src/main/java/com/example/solidconnection/auth/controller/config/RefreshTokenCookieProperties.java new file mode 100644 index 000000000..1fa47d884 --- /dev/null +++ b/src/main/java/com/example/solidconnection/auth/controller/config/RefreshTokenCookieProperties.java @@ -0,0 +1,21 @@ +package com.example.solidconnection.auth.controller.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.web.server.Cookie.SameSite; + +@ConfigurationProperties(prefix = "token.refresh") +public record RefreshTokenCookieProperties( + String cookieDomain +) { + + public String sameSite() { + if (isDomainSet()) { + return SameSite.STRICT.attributeValue(); // 도메인을 지정한 경우 SameSite=Strict + } + return SameSite.NONE.attributeValue(); // 도메인을 지정하지 않은 경우 SameSite=None + } + + private boolean isDomainSet() { + return cookieDomain != null && !cookieDomain.isBlank(); + } +} diff --git a/src/test/java/com/example/solidconnection/auth/controller/config/RefreshTokenCookiePropertiesTest.java b/src/test/java/com/example/solidconnection/auth/controller/config/RefreshTokenCookiePropertiesTest.java new file mode 100644 index 000000000..0a62541b1 --- /dev/null +++ b/src/test/java/com/example/solidconnection/auth/controller/config/RefreshTokenCookiePropertiesTest.java @@ -0,0 +1,35 @@ +package com.example.solidconnection.auth.controller.config; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.boot.web.server.Cookie.SameSite; + +@DisplayName("리프레시 토큰 쿠키 설정 테스트") +class RefreshTokenCookiePropertiesTest { + + @Test + void Domain을_지정했으면_SameSite가_Strict() { + // given + RefreshTokenCookieProperties properties = new RefreshTokenCookieProperties("example.com"); + + // when + String sameSite = properties.sameSite(); + + // then + assertThat(sameSite).isEqualTo(SameSite.STRICT.attributeValue()); + } + + @Test + void Domain을_지정하지_않았으면_SameSite가_None() { + // given + RefreshTokenCookieProperties properties = new RefreshTokenCookieProperties(null); + + // when + String sameSite = properties.sameSite(); + + // then + assertThat(sameSite).isEqualTo(SameSite.NONE.attributeValue()); + } +} From effba1cd13a1640771d0f00a0f265e728ac84291 Mon Sep 17 00:00:00 2001 From: nayonsoso Date: Thu, 14 Aug 2025 07:10:28 +0900 Subject: [PATCH 4/5] =?UTF-8?q?refactor:=20=ED=99=98=EA=B2=BD=EC=97=90=20?= =?UTF-8?q?=EB=94=B0=EB=9D=BC=20=EC=BF=A0=ED=82=A4=EB=A5=BC=20=EB=8B=A4?= =?UTF-8?q?=EB=A5=B4=EA=B2=8C=20=EC=84=A4=EC=A0=95=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/RefreshTokenCookieManager.java | 9 ++++++-- .../RefreshTokenCookieManagerTest.java | 23 ++++++++++++++++--- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/example/solidconnection/auth/controller/RefreshTokenCookieManager.java b/src/main/java/com/example/solidconnection/auth/controller/RefreshTokenCookieManager.java index f51ca93cb..b0a172e2a 100644 --- a/src/main/java/com/example/solidconnection/auth/controller/RefreshTokenCookieManager.java +++ b/src/main/java/com/example/solidconnection/auth/controller/RefreshTokenCookieManager.java @@ -1,17 +1,21 @@ package com.example.solidconnection.auth.controller; +import com.example.solidconnection.auth.controller.config.RefreshTokenCookieProperties; import com.example.solidconnection.auth.domain.TokenType; import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; import org.springframework.http.HttpHeaders; import org.springframework.http.ResponseCookie; import org.springframework.stereotype.Component; @Component +@RequiredArgsConstructor public class RefreshTokenCookieManager { private static final String COOKIE_NAME = "refreshToken"; private static final String PATH = "/"; - private static final String SAME_SITE = "Strict"; + + private final RefreshTokenCookieProperties properties; public void setCookie(HttpServletResponse response, String refreshToken) { long maxAge = convertExpireTimeToCookieMaxAge(TokenType.REFRESH.getExpireTime()); @@ -35,7 +39,8 @@ private void setRefreshTokenCookie( .secure(true) .path(PATH) .maxAge(maxAge) - .sameSite(SAME_SITE) + .domain(properties.cookieDomain()) + .sameSite(properties.sameSite()) .build(); response.addHeader(HttpHeaders.SET_COOKIE, cookie.toString()); } diff --git a/src/test/java/com/example/solidconnection/auth/controller/RefreshTokenCookieManagerTest.java b/src/test/java/com/example/solidconnection/auth/controller/RefreshTokenCookieManagerTest.java index 944be37ab..91ff13cfa 100644 --- a/src/test/java/com/example/solidconnection/auth/controller/RefreshTokenCookieManagerTest.java +++ b/src/test/java/com/example/solidconnection/auth/controller/RefreshTokenCookieManagerTest.java @@ -2,21 +2,35 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertAll; +import static org.mockito.BDDMockito.given; +import com.example.solidconnection.auth.controller.config.RefreshTokenCookieProperties; import com.example.solidconnection.auth.domain.TokenType; +import com.example.solidconnection.support.TestContainerSpringBootTest; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.mock.web.MockHttpServletResponse; @DisplayName("리프레시 토큰 쿠키 매니저 테스트") +@TestContainerSpringBootTest class RefreshTokenCookieManagerTest { + @Autowired private RefreshTokenCookieManager cookieManager; + @MockBean + private RefreshTokenCookieProperties refreshTokenCookieProperties; + + private final String sameSite = "Strict"; + private final String domain = "example.com"; + @BeforeEach void setUp() { - cookieManager = new RefreshTokenCookieManager(); + given(refreshTokenCookieProperties.cookieDomain()).willReturn(domain); + given(refreshTokenCookieProperties.sameSite()).willReturn(sameSite); } @Test @@ -37,7 +51,8 @@ void setUp() { () -> assertThat(header).contains("Secure"), () -> assertThat(header).contains("Path=/"), () -> assertThat(header).contains("Max-Age=" + TokenType.REFRESH.getExpireTime() / 1000), - () -> assertThat(header).contains("SameSite=Strict") + () -> assertThat(header).contains("Domain=" + domain), + () -> assertThat(header).contains("SameSite=" + sameSite) ); } @@ -58,7 +73,9 @@ void setUp() { () -> assertThat(header).contains("Secure"), () -> assertThat(header).contains("Path=/"), () -> assertThat(header).contains("Max-Age=0"), - () -> assertThat(header).contains("SameSite=Strict") + () -> assertThat(header).contains("SameSite=Strict"), + () -> assertThat(header).contains("Domain=" + domain), + () -> assertThat(header).contains("SameSite=" + sameSite) ); } } From db1be71016114e66fc06961592fe5dc20876acab Mon Sep 17 00:00:00 2001 From: nayonsoso Date: Thu, 14 Aug 2025 09:13:12 +0900 Subject: [PATCH 5/5] =?UTF-8?q?chore:=20=EC=84=9C=EB=B8=8C=EB=AA=A8?= =?UTF-8?q?=EB=93=88=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/secret | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/secret b/src/main/resources/secret index e592f6d36..0e9f5d0ce 160000 --- a/src/main/resources/secret +++ b/src/main/resources/secret @@ -1 +1 @@ -Subproject commit e592f6d36f57185c8d92a7838c0e3039603b2c57 +Subproject commit 0e9f5d0cefabab1ab9a306099b457225ce5d641e