[개발 상식] 쿠키의 HttpOnly, Secure, SameSite

HTTP 통신 중 사용자의 중요 정보를 담고 있는 쿠키를 보호하기 위한 방법으로, 여러 쿠키 플래그가 있습니다. 그 중에서도 HttpOnly, Secure, 그리고 SameSite 플래그에 대해 자세히 알아보고자 합니다.

1. HttpOnly 플래그의 역할

HttpOnly 플래그는 웹 어플리케이션에서 쿠키를 더 안전하게 관리할 수 있게 도와주는 설정입니다. 이 플래그가 설정된 쿠키는 클라이언트 사이드 스크립트, 즉 자바스크립트를 통한 접근이 차단됩니다.

사용자가 웹 페이지에 접속할 때 서버에서 HttpOnly 플래그를 포함한 쿠키를 전송하면, 해당 쿠키는 브라우저에 저장되지만 document.cookie를 통한 직접적인 접근은 불가능해집니다.

이러한 특성 덕분에, HttpOnly 쿠키는 Cross-Site Scripting (XSS) 공격으로부터 사용자 정보를 보호하는 데 큰 역할을 합니다. XSS 공격은 악의적인 스크립트가 웹 페이지에 삽입되어 사용자의 쿠키를 탈취하려 할 때 발생할 수 있는데, HttpOnly 플래그는 이러한 접근을 효과적으로 막아줍니다.

Set-Cookie: session_id=abc123; HttpOnly

2. Secure 플래그의 역할

Secure 플래그는 쿠키가 HTTPS 프로토콜을 통해서만 전송되도록 제한합니다. 이 설정은 쿠키 데이터가 암호화 되지 않은 HTTP를 통해 전송되는 것을 원천 차단하여, 평문으로 전송되어 발생할 수 있는 정보 유출를 방지해줍니다.

Set-Cookie: user_token=xyz789; Secure

3. SameSite 플래그의 기능

SameSite 플래그는 쿠키를 동일한 도메인의 요청에만 전송하도록 제한하여 Cross-Site Request Forgery (CSRF) 공격을 방지합니다. SameSite 플래그에는 주로 세 가지 옵션이 있습니다:

  • Strict: 가장 엄격한 옵션으로, 정확히 같은 도메인에서 발생한 요청에만 포함됩니다.
  • Set-Cookie: auth=def456; SameSite=Strict
  • Lax: 기본 설정으로, 일부 크로스 사이트 요청(예: 사용자가 직접 클릭하는 링크)에서는 쿠키를 허용합니다. 이는 사용자 경험을 저해하지 않으면서도 보안을 강화합니다.
  • Set-Cookie: auth=def456; SameSite=Lax
  • None: 쿠키가 모든 크로스 사이트 요청에 포함될 수 있도록 허용합니다. 이 옵션을 사용할 때는 반드시 Secure 플래그도 설정해야 안전합니다.
  • Set-Cookie: data=klm789; SameSite=None; Secure

그렇다면 SameStie와 SameOrigin의 차이는 뭘까요?

  • https://www.example.com과 http://blog.example.com은 같은 site입니다.
  • https://www.example.com:443과 https://www.example.com은 같은 origin입니다.
  • https://www.example.com과 http://www.example.com은 다른 origin입니다 (프로토콜이 다르기 때문).