Spring Security / / 2024. 10. 31. 16:42

SameSite

SameSite쿠키의 보안 속성으로, 쿠키가 외부 사이트의 요청과 함께 브라우저로 전송되는 방식을 제어합니다. 이를 통해 CSRF(Cross-Site Request Forgery) 공격을 방지하는 데 도움을 줍니다. SameSite 속성에는 세 가지 옵션이 있으며, 각각의 옵션이 쿠키 전송을 제한하는 방식이 다릅니다.

 

SameSite의 세 가지 옵션

 

1. SameSite=Strict

2. SameSite=Lax

3. SameSite=None

 

1. SameSite=Strict

 

동작: 엄격한 모드로, 쿠키가 외부 사이트에서 전송된 요청에는 절대 포함되지 않습니다.

사용 예: 사용자가 직접 입력한 도메인에서만 쿠키가 전송되며, 링크나 외부 사이트에서 리디렉션되는 요청에는 쿠키가 포함되지 않습니다.

장점: 보안성이 높아, CSRF 공격 방어에 가장 효과적입니다.

단점: 사용자가 링크를 클릭해 다른 사이트에서 해당 사이트로 이동할 경우 로그인 쿠키 등이 포함되지 않아 사용성이 떨어질 수 있습니다.

 

예시

Set-Cookie: sessionid=abc123; SameSite=Strict

 

적용 예시: example.com 사이트에서 설정된 쿠키는 다른 사이트에서 example.com으로 넘어올 때 전송되지 않습니다.

 

2. SameSite=Lax

 

동작: 느슨한 모드로, 사용자가 직접 링크를 클릭하거나 GET 요청으로 이동할 때는 쿠키가 전송되지만, POST, PUT 등의 요청에는 전송되지 않습니다.

사용 예: 로그인, 장바구니 기능처럼 CSRF 공격 방지가 필요한 경우에 적절하지만, 외부 사이트에서 링크 클릭 시 세션을 유지할 수 있어 사용성이 좋습니다.

장점: CSRF에 대한 기본적인 방어 효과를 제공하면서도 사용자 경험에 불편을 주지 않습니다.

단점: 일부 상황에서는 보안성이 Strict보다 낮을 수 있습니다.

 

예시

Set-Cookie: sessionid=abc123; SameSite=Lax

 

적용 예시: example.com의 쿠키는 외부 사이트에서 링크를 클릭해 GET 요청으로 example.com에 접근할 때 전송됩니다.

 

3. SameSite=None

 

동작: 제한 없이 쿠키가 모든 요청에 포함되며, 외부 사이트에서 SameSite=None을 사용하려면 Secure 속성도 함께 설정되어야 합니다.

사용 예: 제3자 서비스와의 통합이 필요한 경우, 예를 들어 OAuth 로그인, 광고 추적, 서드파티 분석 도구 등을 사용할 때 필요합니다.

장점: 제한 없이 모든 요청에 쿠키를 포함시켜 제3자 서비스와의 호환성을 보장합니다.

단점: 보안성이 낮아 CSRF 공격에 취약할 수 있으며, HTTPS가 아닌 환경에서는 사용 불가합니다.

 

예시

Set-Cookie: sessionid=abc123; SameSite=None; Secure

 

적용 예시: example.com의 쿠키가 모든 사이트에서 접근할 수 있어 외부 사이트의 모든 요청에 포함됩니다.

 

SameSite 속성 요약

SameSite 속성 요약

SameSite 옵션 설명 쿠키 전송 조건
SameSite=Strict 외부 사이트에서의 모든 요청에 대해 쿠키가 전송되지 않음 같은 사이트에서 요청할 때만 쿠키 전송
SameSite=Lax 외부 사이트에서의 GET 요청 시에만 쿠키 전송 가능 사용자가 클릭한 링크를 통해 접근할 때, GET 요청에만 쿠키 전송
SameSite=None 모든 사이트의 요청에 대해 쿠키가 전송됨. Secure 속성 필요 모든 요청에 대해 쿠키 전송 (HTTPS 필요)

참고: SameSite 속성은 CSRF 공격을 방지하고, 사이트 간의 안전한 쿠키 사용을 돕는 데 사용됩니다.

 

SameSite 속성 설정 예제 (Spring Boot)

 

Spring Boot에서 SameSite 속성을 설정하려면 ServletWebServerFactory 또는 CookieSameSite 속성을 직접 설정합니다.

import org.apache.tomcat.util.http.Rfc6265CookieProcessor;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class WebConfig {

    @Bean
    public ServletWebServerFactory servletWebServerFactory() {
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
        factory.addContextCustomizers(context -> {
            Rfc6265CookieProcessor cookieProcessor = new Rfc6265CookieProcessor();
            cookieProcessor.setSameSiteCookies("Strict"); // SameSite 속성 설정
            context.setCookieProcessor(cookieProcessor);
        });
        return factory;
    }
}

 

위 설정으로 모든 쿠키가 SameSite=Strict 속성을 가지게 되어 보안이 강화됩니다.

 

결론

 

SameSite 속성은 CSRF 공격 방지와 세션 보안에 유용합니다.

Strict, Lax, None 옵션을 상황에 맞게 사용하여 보안과 사용자 경험을 모두 고려할 수 있습니다.

특히 보안이 필요한 애플리케이션에서는 SameSite=Lax 또는 SameSite=Strict를 설정해 보안을 강화하는 것이 좋습니다.

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유