Develop/JAVA

[Java] Spring Security 에서 SameSite 설정방법 (PG사 결제 시 리턴 후 세션 끊김현상 해결)

issuemaker99 2024. 10. 24. 20:04
728x90

1. Spring Security를 사용하는 방법

Spring Security를 사용하는 경우 HttpSession의 쿠키 속성에 SameSite 옵션을 추가할 수 있습니다. SameSite 속성은 기본적으로 Strict, Lax, 또는 None으로 설정할 수 있습니다.

Spring Security에서 SameSite 설정하기

Spring Security의 CookieSerializer를 설정하여 SameSite 속성을 지정할 수 있습니다.

import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.session.web.http.CookieSerializer;
import org.springframework.session.web.http.DefaultCookieSerializer;

@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            // 기본적인 보안 설정
            .authorizeRequests(authorizeRequests ->
                authorizeRequests.anyRequest().authenticated()
            )
            .csrf().disable(); // 필요시 CSRF 설정

        return http.build();
    }

    @Bean
    public CookieSerializer cookieSerializer() {
        DefaultCookieSerializer serializer = new DefaultCookieSerializer();
        serializer.setSameSite("None"); // 'Strict', 'Lax', 'None' 중 선택
        serializer.setUseSecureCookie(true); // none 사용시 필수 설정
        return serializer;
    }
}

 

위의 설정에서 cookieSerializer() 메서드는 DefaultCookieSerializer 객체를 반환하고, setSameSite 메서드를 통해 SameSite 속성을 설정합니다. 

2. 서블릿 필터를 사용하여 수동으로 쿠키 설정하기

Spring Security를 사용하지 않는 경우, 서블릿 필터를 만들어 직접 SameSite 속성을 추가할 수도 있습니다.

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Cookie;

import java.io.IOException;

public class SameSiteCookieFilter implements Filter {

    @Override
    public void doFilter(
        HttpServletRequest request, 
        HttpServletResponse response, 
        FilterChain chain) throws IOException, ServletException {

        chain.doFilter(request, response);

        // 모든 응답 쿠키에 SameSite 속성 추가
        for (Cookie cookie : request.getCookies()) {
            String cookieHeader = String.format("%s=%s; Path=%s; SameSite=Strict", 
                                                cookie.getName(), 
                                                cookie.getValue(), 
                                                cookie.getPath());
            response.addHeader("Set-Cookie", cookieHeader);
        }
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 초기화 작업 필요 시
    }

    @Override
    public void destroy() {
        // 리소스 해제 필요 시
    }
}

 

이 필터는 HTTP 요청에 있는 쿠키들을 가져와 응답에 SameSite 속성을 추가합니다. 해당 필터를 스프링 설정에 등록하여 사용하면 됩니다.

3. application.properties에서 설정 (Spring Session을 사용하는 경우)

Spring Session을 사용 중이라면 application.properties 또는 application.yml 파일에서 간단히 설정할 수 있습니다.

server.servlet.session.cookie.same-site=none
server.servlet.session.cookie.secure=true

 

LIST