Տɑʍҽ ՏíԵҽ

2024. 8. 1. 20:40TIL

✔오늘 배운 중요한 🔑 point

  • CSRF를 방지하기 위해서 Same Site 설정이 효과적이다.
  • LAX        (같은 사이트+ GET요청 크로스 사이트)
  • STRICT (같은 사이트)
  • NONE    (같은 사이트+ 크로스 사이트)

🎯 오늘 배운 내용

 

Same Site란?

웹 애플리케이션에서 CSRF(교차 사이트 요청 위조) 공격을 방지하기 위해 HTTP 쿠키에서 설정할 수 있는 속성

 

Same Site가 왜 중요할까?

CSRF 공격은 악성 웹사이트가 사용자가 로그인된 상태인 웹사이트에 비정상적인 요청을 보내도록 하는 공격이다. SameSite 속성을 사용하면 쿠키가 특정 조건에서만 전송되므로, 이러한 공격을 효과적으로 방지할 수 있기 때문에 SameSite는 매우 중요하다.

 

Same Site종류

 

LAX

 

  • 쿠키가 설정된 사이트에서 시작된 요청에만 쿠키가 전송
  • GET 메서드에 의한 네비게이션 요청(링크 클릭, URL 직접 입력)에는 쿠키가 전송되지만, POST 메서드나 AJAX 요청에는 전송되지 않음
  • 대부분의 경우에 적합한 설정.

 

 

STRICT

 

  • 쿠키가 설정된 사이트에서 시작된 요청에만 쿠키가 전송
  • 사용자가 직접 URL을 입력하거나 북마크를 통해 사이트에 접근할 때만 쿠키가 전송
  • 다른 웹사이트에서 링크를 클릭하여 해당 사이트에 접근할 경우, 쿠키는 전송되지 않음
  • 주로 보안이 매우 중요한 사이트에서 사용

 

 

NONE

 

  • 쿠키가 모든 컨텍스트에서 전송될 수 있게 합니다.
  • 교차 사이트 요청에도 쿠키가 전송되므로, 다른 웹사이트에서 이 사이트의 리소스를 요청할 때도 쿠키가 전송
  • SameSite=None을 사용하려면 Secure 속성도 함께 설정해야 하며  쿠키는 HTTPS를 통해서만 전송됨.
  • 주로 서드 파티 쿠키를 사용해야 하는 경우 (소셜 로그인) 사용

 

 

 

Same Site 설정

 

val cookie = ResponseCookie.from("refreshToken", token.refreshToken)
    .httpOnly(true)
    .secure(true)
    .sameSite("None")
    .maxAge(7 * 24 * 60 * 60)
    .path("/")
    .build()

소셜로그인을 사용했기때문에 sameSite설정을 None으로 설정하고 Https를 위한 secure설정을 해주었다.

 

 

소셜로그인 진행시 RefreshToken이 쿠키에 HttpOnly ,SameSite=None이 잘 설정이 된것을 확인할 수 있다.

 

 

🤔 어떻게 활용할까?

소셜로그인으로 인해서 sameSite를 NONE으로 설정을 하였는데, 현재 프로젝트에서는 일반 로그인과 소셜로그인이 같이 구현되어있으므로 경우에 따라서 일반로그인의 sameSite는 LAX로 설정하고 소셜로그인의 sameSite는NONE으로 설정하는것을 고민을 해봐야겠다. 하지만 일반적으로는  일관된 보안 정책을 유지하는 것이 좋기 때문에 한 가지 SameSite 설정을 전체 애플리케이션에 적용하는 경우도 있다고 하니 충분히 고려를 해보고 적용을 해봐야겠다.

📓 오늘의 한줄

"The only way to make sense out of change is to plunge into it, move with it, and join the dance."

- Alan Watts -