[설정] localhost login 가능하게 수정
This commit is contained in:
@@ -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:
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user