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=Strict | 외부 사이트에서의 모든 요청에 대해 쿠키가 전송되지 않음 | 같은 사이트에서 요청할 때만 쿠키 전송 |
SameSite=Lax | 외부 사이트에서의 GET 요청 시에만 쿠키 전송 가능 |
사용자가 클릭한 링크를 통해 접근할 때, GET 요청에만 쿠키 전송 |
SameSite=None | 모든 사이트의 요청에 대해 쿠키가 전송됨. Secure 속성 필요 |
모든 요청에 대해 쿠키 전송 (HTTPS 필요) |
참고: SameSite 속성은 CSRF 공격을 방지하고, 사이트 간의 안전한 쿠키 사용을 돕는 데 사용됩니다.
SameSite 속성 설정 예제 (Spring Boot)
Spring Boot에서 SameSite 속성을 설정하려면 ServletWebServerFactory 또는 Cookie의 SameSite 속성을 직접 설정합니다.
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를 설정해 보안을 강화하는 것이 좋습니다.
'Spring Security' 카테고리의 다른 글
Authentication Filter, Authentication Manager, Authentication Provider (0) | 2024.12.18 |
---|---|
RFC6265 (0) | 2024.10.31 |
CORS(Cross-Origin Resource Sharing)의 Simple Request와 Non-Simple Request (0) | 2024.10.31 |
Spring Security 인증 아키텍처 (0) | 2024.10.31 |
FilterOrderRegistration 클래스 구조와 역할 (0) | 2024.10.31 |