본문 바로가기
IT정보/보안

[보안] SameSite Cookie 적용 여러가지방법 (GS인증 보안성)

by 아크투어 2023. 4. 19.
반응형

1. 개요

  • SameSite는 사이트 간 요청과 함께 쿠키를 보낼지 여부를 제어하기 위해 웹 개발자가 설정할 수 있는 쿠키 속성
  • 아울러 GS인증 보안성에서도 최근에 확인하는 항목으로 이와 별개로 SSL적용과 함께 필수적으로 처리해아한다.
  • SameSite쿠키를 적용하기 위해서는 SSL이 필수적으로 적용되어 있어야한다.

samesite cookie

 

2. SameSite 쿠키 정책종류

  • Strict : 쿠키는 자사 컨텍스트에서만 전송됩니다. 즉, 쿠키를 설정한 동일한 도메인으로만 전송됩니다.
  • Lax : 교차 사이트 요청에서도 쿠키가 전송되지만 사용자가 쿠키를 설정한 사이트와 상호 작용한 경우(예: 링크 클릭)에만 쿠키가 전송됩니다.
  • None : 소스에 관계없이 모든 요청에 ​​대해 쿠키가 전송됩니다.

 

3. Strict 적용사례

  • 브라우저 애플리케이션 부분 SameSite 영역에 Strict가 표기된다.
  • 예시 : proxy_cookie_path / "/; secure; HttpOnly; SameSite=Strict";   ( HttpOnly 또는 Secure 추가옵션)
  • 예시 : proxy_cookie_path / "/; SameSite=Strict";  (일반)

samesite 적용사례

  • None / Strict / Lax 별 적용화면

samesite cookie

 

4. [Nginx 적용]

//Strict
proxy_cookie_path / "/; secure; HttpOnly; SameSite=Strict";
또는
proxy_cookie_path / "/; SameSite=Strict"


//Lax
proxy_cookie_path / "/; secure; HttpOnly; SameSite=Lax";
또는
proxy_cookie_path / "/; SameSite=Lax"


//None
proxy_cookie_path / "/; secure; HttpOnly; SameSite=None";
또는
proxy_cookie_path / "/; SameSite=None"

 

 

5. [Tomcat 8.5이상 적용]

  • context.xml - tomcat경로내
# tomcat/conf/context.xml
# samesite 설정을 none으로 바꾸기
<Context>
    ...    
    <CookieProcessor sameSiteCookies="none" />
    ...
</Context>
  • web.xml - tomcat경로내
# tomcat/conf/web.xml

...
<session-config>
    <session-timeout>60</session-timeout>
    <tracking-mode>COOKIE</tracking-mode>
    <cookie-config>
        <http-only>true</http-only>
        <secure>true</secure>
    </cookie-config>
</session-config>
...

 

 

6. [Spring 3~4버전 또는 Java]

  • 아래코드를 사용한다.
  • XML파일에 Filter를 설정하거나 하면 된다.
//SameSiteFilter.java파일생성
import java.io.IOException;

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

public class SameSiteFilter implements Filter {

	@SuppressWarnings("unused")
	private FilterConfig config;

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {

		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse res = (HttpServletResponse) response;
		res.setHeader("Set-Cookie", "locale=pt-BR; HttpOnly; Secure; SameSite=Strict;");

		chain.doFilter(req, res);
	}

	public void init(FilterConfig config) throws ServletException {
		this.config = config;
	}

	public void destroy() {

	}
}

 

 

7. [전자정부프레임워크 3.x 이상]

  • 전자정부프레임워크 내에서는 아래처럼 작성한다.
//해당파일내 소스추가
EgovWebApplicationInitializer.java

...
FilterRegistration.Dynamic sameSiteFilter = servletContext.addFilter("sameSiteFilter", new SameSiteFilter());
sameSiteFilter.addMappingForUrlPatterns(null, false, "/*");
...


//SameSiteFilter.java파일생성
import java.io.IOException;

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

public class SameSiteFilter implements Filter {

	@SuppressWarnings("unused")
	private FilterConfig config;

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {

		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse res = (HttpServletResponse) response;
		res.setHeader("Set-Cookie", "locale=pt-BR; HttpOnly; Secure; SameSite=Strict;");

		chain.doFilter(req, res);
	}

	public void init(FilterConfig config) throws ServletException {
		this.config = config;
	}

	public void destroy() {

	}
}

 

 

6. [Spring-Boot]

  • application.properties파일일경우
//strict
server.servlet.session.cookie.same-site=strict

//lax
server.servlet.session.cookie.same-site=lax

//none
server.servlet.session.cookie.same-site=none
  • application.yml 파일일경우
//strict의경우
sever:
   servlet:
      session:
         cookie:
            same-site:"strict"

//lax의경우
sever:
   servlet:
      session:
         cookie:
            same-site:"lax"
            
            
//none일경우  SameSite 속성을 None으로 설정할 경우 Secure 속성을 함께 추가해야함
sever:
   servlet:
      session:
         cookie:
            same-site:"strict"
            secure:true

 

 

★. Cookie관련

  • 아래문법에서 cookie.setSameSite 는 사용할수없다. (빨간줄 표시로 인식불가)
  • javax.servlet.http.Cookie는 Servlet API 4.0에서 도입되서 4.0이전버전은 해당기능을 사용할수 없다.
Cookie cookie = new Cookie("cookieName", "cookieValue");
cookie.setSecure(true); // optional - sets the "Secure" attribute to ensure the cookie is only sent over HTTPS
cookie.setHttpOnly(true); // optional - sets the "HttpOnly" attribute to prevent client-side script access
cookie.setSameSite("Strict"); // sets the "SameSite" attribute to "Strict"
반응형