본문 바로가기

Language/Spring Security

SameSite

728x90
  • SameSite는 최신 방식의 CSRF 공격 방어 방법 중 하나로서 서버가 쿠키를 설정할 때 SameSite 속성을 지정하여 크로스 사이트 간 쿠키 전송에 대한 제어를 핸들링 가능
    → 목적 : 쿠키 전송에 대한 제어 핸들링
  • Spring Security는 세션 쿠키의 생성을 직접 제어하지 않기 때문에 SameSite 속성에 대한 지원을 제공하지 않지만 Spring Session은 SameSite 속성을 지원

 

Samesite 속성

  • Strict
    • 동일 사이트에서 오는 모든 요청에 쿠키가 포함되고 크로스 사이트간 HTTP 요청에 쿠키가 포함되지 않음

  • Lax(기본 설정)
    • 동일 사이트에서 오거나 Top Level Navigation에서 오는 요청 및 메소드가 읽기 전용인 경우 쿠키가 전송되고 그렇지 않으면 HTTP 요청에 쿠키가 포함되지 않음
    • 사용자가 링크(<a>)를 클릭하거나 window.location.replace , 302 리다이렉트 등의 이동에는 쿠키가 포함
      → 단, <iframe>이나 <img>를 문서에 삽입, AJAX 통신 등은 쿠키가 전송되지 않음

  • None
    • 동일 사이트 및 크로스 사이트 요청의 경우에도 쿠키가 전송
      → 이 모드에서는 HTTPS 의한 Secure 쿠키로 설정되어야 함


Samesite 예시

  • CSRF는 CSRF Token이 반드시 첨부가 되어야 접속을 받아주게 되고, SameSite는 토큰이 아니라 쿠키 자체의 설정을 통해 쿠키를 서버에 전송 자체를 안 하여서 공격을 방어
  • 대부분의 현대 브라우저는 SameSite 속성을 지원하지만, 여전히 사용 중인 오래된 브라우저는 지원하지 않을 수 있음
  • SameSite는 CSRF 공격에 대한 유일한 방어 수단으로서가 아니라 심층적으로 강화된 방어의 일환으로 사용하는 것을 권장

Spring Session 으로 SameSite 적용하기

  • implementation group: 'org.springframework.session', name: 'spring-session-core', version: '3.2.1’
@Configuration
@EnableSpringHttpSession
public class HttpSessionConfig {
	@Bean
	public CookieSerializer cookieSerializer() {
		DefaultCookieSerializer serializer = new DefaultCookieSerializer();
		serializer.setUseSecureCookie(true);
		serializer.setUseHttpOnlyCookie(true);
		serializer.setSameSite("Lax");
		return serializer;
	}
	@Bean
	public SessionRepository<MapSession> sessionRepository() {
		return new MapSessionRepository(new ConcurrentHashMap<>());
	}
}
  • 쿠키를 확인해보면 JSESSIONID가 아니라 SESSION이란 이름으로 생성

728x90