본문 바로가기

보안/Web

[ 보안 ] Cookie - SameSite - 보안 설정하기

반응형

SameSite 속성은 웹 애플리케이션에서 쿠키의 보안을 강화하는 데 사용됩니다. 주로 사이트 간 요청 위조(CSRF) 공격을 방지하기 위해 사용되며, 다음과 같은 옵션이 있습니다:

  1. SameSite=Strict: 쿠키를 발급한 사이트에서만 접근할 수 있으며, 다른 사이트에서 접근하는 모든 요청에 대해 쿠키가 전송되지 않습니다. 가장 안전한 설정이지만 사용성 측면에서는 제한적입니다.
  2. SameSite=Lax: 기본 옵션으로, 쿠키가 외부 사이트에서의 GET 요청에는 전송되지만 POST 요청에는 전송되지 않습니다. 보안성과 접근성의 균형을 맞추는 설정입니다.
  3. SameSite=None: 모든 요청에 대해 쿠키가 전송되도록 하며, 특히 서드파티 쿠키를 사용하는 경우 필요합니다. 이 경우 Secure 속성을 함께 설정해야 합니다. 그렇지 않으면 쿠키가 무시됩니다.

1. 보안 문제

  • CSRF: 공격자가 사용자의 인증된 세션을 악용해 특정 작업을 수행하도록 유도하는 공격입니다. SameSite 속성을 설정하면 CSRF 공격의 위험을 줄일 수 있습니다.
  • XSS: 사이트 간 스크립팅 공격으로, 공격자가 사용자의 브라우저에서 임의의 스크립트를 실행하는 방법입니다. SameSite는 XSS를 직접적으로 방어하지 않으나, 보안을 강화하는 한 요소로 작용합니다.
  • 서드파티 추적: SameSite 설정을 통해 불필요한 서드파티 쿠키가 사용자의 브라우저에 전송되는 것을 방지해, 추적을 줄이는 데 도움을 줍니다.

2. Apache에서 SameSite 설정 방법

Apache 서버에서는 Header 지시어를 사용해 응답 헤더에 쿠키 속성을 설정할 수 있습니다. 이를 통해 SameSite 속성을 추가할 수 있습니다. 예시로는 Set-Cookie 헤더를 조작하는 방법이 있습니다.

-   /etc/apache2/site-available/000-default.conf

<IfModule mod_headers.c>
                Header set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:"
                Header set Referrer-Policy "strict-origin-when-cross-origin"
                Header set Set-Cookie "Secure; HttpOnly; SameSite=Strict"
</IfModule>

 

# Apache 설정 파일 (예: httpd.conf 또는 .htaccess)
# SameSite=Lax 예시
Header always edit Set-Cookie ^(.*)$ "$1; SameSite=Lax"

# SameSite=Strict 예시
Header always edit Set-Cookie ^(.*)$ "$1; SameSite=Strict"

# SameSite=None 예시 (HTTPS만 가능)
Header always edit Set-Cookie ^(.*)$ "$1; Secure; SameSite=None"

3. Apache Tomcat에서 SameSite 설정 방법

Tomcat은 기본적으로 SameSite 속성을 직접 설정할 수 없으므로, 커스텀 필터를 추가하거나 context.xml 파일에서 쿠키 속성을 추가하는 방식으로 설정합니다.

방법 1: 커스텀 필터 사용

쿠키에 SameSite 속성을 추가하는 Java 필터를 작성하고 web.xml에 등록할 수 있습니다.

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;

public class SameSiteFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        chain.doFilter(request, response);
        if (response instanceof HttpServletResponse) {
            HttpServletResponse httpServletResponse = (HttpServletResponse) response;
            Collection<String> headers = httpServletResponse.getHeaders("Set-Cookie");
            for (String header : headers) {
                httpServletResponse.setHeader("Set-Cookie", header + "; SameSite=Lax");
            }
        }
    }
}

그리고 web.xml 파일에 필터를 등록합니다.

<filter>
    <filter-name>sameSiteFilter</filter-name>
    <filter-class>com.example.SameSiteFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>sameSiteFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

4. Nginx에서 SameSite 설정 방법

Nginx에서는 SameSite 속성을 설정하기 위해 proxy_cookie_path 지시어를 사용하여 특정 쿠키 경로에 SameSite를 추가합니다.

# Nginx 설정 파일 (예: nginx.conf)
# SameSite=Lax 설정 예시
proxy_cookie_path / "/; SameSite=Lax";

# SameSite=Strict 설정 예시
proxy_cookie_path / "/; SameSite=Strict";

# SameSite=None 설정 예시 (HTTPS만 가능)
proxy_cookie_path / "/; Secure; SameSite=None";

이러한 설정을 통해 Apache, Apache Tomcat, Nginx에서 쿠키에 SameSite 속성을 추가해 보안을 강화할 수 있습니다.

반응형

'보안 > Web' 카테고리의 다른 글

[ 보안 ] Content-Security-Policy - 보안 설정하기  (0) 2024.11.11