[설정] localhost login 가능하게 수정

This commit is contained in:
2026-03-10 16:15:21 +09:00
parent b52a4eda67
commit 961ea80060
6 changed files with 24 additions and 13 deletions
@@ -5,13 +5,13 @@ import org.springframework.http.ResponseCookie;
public class SessionUtil { public class SessionUtil {
// 쿠키 삭제 // 쿠키 삭제
public static void expireCookie(HttpServletResponse response, String name, String cookieDomain, boolean cookieSecure) { public static void expireCookie(HttpServletResponse response, String name, String cookieDomain, boolean cookieSecure, String cookieSameSite) {
ResponseCookie cookie = ResponseCookie.from(name, "") ResponseCookie cookie = ResponseCookie.from(name, "")
.domain(cookieDomain) .domain(cookieDomain)
.path("/") .path("/")
.httpOnly(true) .httpOnly(true)
.secure(cookieSecure) .secure(cookieSecure)
.sameSite("Lax") .sameSite(cookieSameSite)
.maxAge(0) .maxAge(0)
.build(); .build();
@@ -19,13 +19,13 @@ public class SessionUtil {
} }
// 쿠키 입력 // 쿠키 입력
public static void addTokenCookie(HttpServletResponse response, String name, String value, String cookieDomain, boolean cookieSecure, long maxAgeSeconds) { public static void addTokenCookie(HttpServletResponse response, String name, String value, String cookieDomain, boolean cookieSecure, String cookieSameSite, long maxAgeSeconds) {
ResponseCookie cookie = ResponseCookie.from(name, value) ResponseCookie cookie = ResponseCookie.from(name, value)
.domain(cookieDomain) .domain(cookieDomain)
.path("/") .path("/")
.httpOnly(true) .httpOnly(true)
.secure(cookieSecure) .secure(cookieSecure)
.sameSite("Lax") .sameSite(cookieSameSite)
.maxAge(maxAgeSeconds) .maxAge(maxAgeSeconds)
.build(); .build();
response.addHeader("Set-Cookie", cookie.toString()); response.addHeader("Set-Cookie", cookie.toString());
@@ -20,6 +20,9 @@ public class RedisSessionConfig {
@Value("${cookie.name}") @Value("${cookie.name}")
private String cookieName; private String cookieName;
@Value("${cookie.same-site:Lax}")
private String cookieSameSite;
@Bean @Bean
public CookieSerializer cookieSerializer() { public CookieSerializer cookieSerializer() {
DefaultCookieSerializer serializer = new DefaultCookieSerializer(); DefaultCookieSerializer serializer = new DefaultCookieSerializer();
@@ -30,7 +33,7 @@ public class RedisSessionConfig {
serializer.setCookiePath("/"); serializer.setCookiePath("/");
serializer.setUseSecureCookie(cookieSecure); // 환경별 설정 (local: false, pjt: true) serializer.setUseSecureCookie(cookieSecure); // 환경별 설정 (local: false, pjt: true)
serializer.setUseHttpOnlyCookie(true); // XSS 방지 serializer.setUseHttpOnlyCookie(true); // XSS 방지
serializer.setSameSite("Lax"); // CSRF 방지 serializer.setSameSite(cookieSameSite); // CSRF 방지
if (cookieDomain != null && !cookieDomain.isBlank()) { if (cookieDomain != null && !cookieDomain.isBlank()) {
serializer.setDomainName(cookieDomain.trim()); serializer.setDomainName(cookieDomain.trim());
@@ -37,6 +37,9 @@ public class AuthController {
@Value("${cookie.name}") @Value("${cookie.name}")
private String cookieName; private String cookieName;
@Value("${cookie.same-site:Lax}")
private String cookieSameSite;
@Value("${jwt.access-token-validity-seconds}") @Value("${jwt.access-token-validity-seconds}")
private long accessTokenValiditySeconds; private long accessTokenValiditySeconds;
@@ -79,8 +82,8 @@ public class AuthController {
return ApiResponse.entity(Map.of("refreshed", false), ApiResponseCode.CODE_401); return ApiResponse.entity(Map.of("refreshed", false), ApiResponseCode.CODE_401);
} }
SessionUtil.addTokenCookie(response, "accessToken", testLogin.getAccessToken(), cookieDomain, cookieSecure, accessTokenValiditySeconds); SessionUtil.addTokenCookie(response, "accessToken", testLogin.getAccessToken(), cookieDomain, cookieSecure, cookieSameSite, accessTokenValiditySeconds);
SessionUtil.addTokenCookie(response, "refreshToken", testLogin.getRefreshToken(), cookieDomain, cookieSecure, refreshTokenValiditySeconds); SessionUtil.addTokenCookie(response, "refreshToken", testLogin.getRefreshToken(), cookieDomain, cookieSecure, cookieSameSite, refreshTokenValiditySeconds);
return ApiResponse.entity(Map.of("refreshed", true), ApiResponseCode.CODE_200); return ApiResponse.entity(Map.of("refreshed", true), ApiResponseCode.CODE_200);
} }
@@ -133,9 +136,9 @@ public class AuthController {
testAuthService.clearRefreshToken(refreshToken); testAuthService.clearRefreshToken(refreshToken);
SessionUtil.expireCookie(response, cookieName, cookieDomain, cookieSecure); SessionUtil.expireCookie(response, cookieName, cookieDomain, cookieSecure, cookieSameSite);
SessionUtil.expireCookie(response, "accessToken", cookieDomain, cookieSecure); SessionUtil.expireCookie(response, "accessToken", cookieDomain, cookieSecure, cookieSameSite);
SessionUtil.expireCookie(response, "refreshToken", cookieDomain, cookieSecure); SessionUtil.expireCookie(response, "refreshToken", cookieDomain, cookieSecure, cookieSameSite);
Map<String, Object> result = new HashMap<>(); Map<String, Object> result = new HashMap<>();
result.put("message", "로그아웃되었습니다."); result.put("message", "로그아웃되었습니다.");
@@ -27,6 +27,9 @@ public class TestAuthController {
@Value("${cookie.domain}") @Value("${cookie.domain}")
private String cookieDomain; private String cookieDomain;
@Value("${cookie.same-site:Lax}")
private String cookieSameSite;
@Value("${jwt.access-token-validity-seconds}") @Value("${jwt.access-token-validity-seconds}")
private long accessTokenValiditySeconds; private long accessTokenValiditySeconds;
@@ -60,10 +63,10 @@ public class TestAuthController {
session.setAttribute("userRole", "USER"); session.setAttribute("userRole", "USER");
// accessToken 쿠키 설정 // accessToken 쿠키 설정
SessionUtil.addTokenCookie(response, "accessToken", testLoginDto.getAccessToken(), cookieDomain, cookieSecure, accessTokenValiditySeconds); SessionUtil.addTokenCookie(response, "accessToken", testLoginDto.getAccessToken(), cookieDomain, cookieSecure, cookieSameSite, accessTokenValiditySeconds);
// refreshToken 쿠키 설정 // refreshToken 쿠키 설정
SessionUtil.addTokenCookie(response, "refreshToken", testLoginDto.getRefreshToken(), cookieDomain, cookieSecure, refreshTokenValiditySeconds); SessionUtil.addTokenCookie(response, "refreshToken", testLoginDto.getRefreshToken(), cookieDomain, cookieSecure, cookieSameSite, refreshTokenValiditySeconds);
// JSON 응답에서는 토큰 제거 (쿠키로만 전달) // JSON 응답에서는 토큰 제거 (쿠키로만 전달)
testLoginDto.setAccessToken(null); testLoginDto.setAccessToken(null);
@@ -36,6 +36,7 @@ cookie:
secure: false # 로컬 개발 환경 (HTTP) secure: false # 로컬 개발 환경 (HTTP)
domain: domain:
name: ALIST_SESSION name: ALIST_SESSION
same-site: Lax
swagger: swagger:
login: login:
+2 -1
View File
@@ -36,8 +36,9 @@ jwt:
cookie: cookie:
secure: true # 프로젝트 환경 (HTTPS) secure: true # 프로젝트 환경 (HTTPS)
domain: # pjt.kr # sso 인증시 주석해제 domain: pjt.kr # sso 인증시 주석해제
name: ALIST_SESSION name: ALIST_SESSION
same-site: None
swagger: swagger:
login: login: