Cookie & Session (쿠키와 세션)
Table of Contents
웹 해킹의 기본 요소인 쿠키 (Cookie) 와 세션 (Session)을 알아가보자 합니다. 두 요소는 웹사이트를 인증하는 역할을 하거나 유저의 정보를 서버로 전달하는 역할을 합니다.
Cookie (쿠키)
- HTTP 통신은 Connectionless 와 Stateless 로 이루어진 통신을 이야기 합니다. 그러므로 서버는 클라이언트를 통신마다 기억할 수 없습니다.
Connectionless: 네트워크 의존도가 낮고, 비용이 저렴하며, 데이터 전송 속도가 빠릅니다. Connection-Oriented: 데이터 통신기간중 네트워크 자원이 예약되고, 비용이 많아 소요되고, 데이터 전송 속도가 느리며, 전체 진행 프로세스 동안, 고정된 컨넥션이 성립하여야 합니다.
- Cookie는 위 와 같은 이유로 HTTP 통신 상태를 유지하기 위해 만들어졌습니다.
- 쿠키는
Key:Value
로 이루어져 있습니다.- 서버에서 클라이언트에게 쿠키를 발급해주면,이 쿠키를 클라이언트가
HTTP Request
를 할때 포함이 됩니다.
- 서버에서 클라이언트에게 쿠키를 발급해주면,이 쿠키를 클라이언트가
- 쿠키가 중요한점으로는 다음과 같습니다.
- 정보의 저장 - 사용자의 정보를 일시적으로 저장합니다.
- 상태 정보 - 사용자의 유니크한 상태를 저장
- 쿠키의 단점으로는다음과 같습니다.
- 클라이언트 브라우저에 저장이되고 매번 HTTP Request마다 내장되어 서버로 보내집니다.
- 클라이언트 브라우저에 저장이 되는 만큼 마음껏 수정이 가능합니다. 서버에서 아무런 확인을 안할경우, 다른유저 정보를 훔칠수 있다는 단점이 있습니다.
Session (세션)
- 서버에서 Validation(확인)을 안할 경우, 공격자가 마음대로 쿠키값을 수정하여, 여러정보를 훔칠수 있습니다.
- 웹서버에서는
Session
이라는것을 만들어 인증정보를 변경하는것을 막습니다. Session
은 서버에 인증정보를 저장하고Key
를 만들어 오로지 해당 세션에 맞는 사용자만 그 사용자만의 정보를 얻을수 있습니다. (sessionID
)
Attack Vector (여러 공격 백터들)
- 쿠키값이나 세션값이 디코딩이 가능한가?
- 쿠키값이나 세션값이 없이 세션유지가 되는가?
- 로그인 할때마다 쿠키값이나 세션값이 똑같이 유지가 되는가?
- 쿠키값이나 세션값을 변조해서 다른유저의 세션을 가로챌수 있는가?
- 쿠키 Security Header 값이 잘 적용 되어 있는가?
Migration (해결책)
Cookie Security Headers
를 셋업 합니다.
SameSite
- CSRF 공격을 방지하는데 도움을 줍니다.SameSite=Lax
: 지정이 되어있지 않다면Lax
가 기본값으로 세팅이 됩니다. 대부분의 크로스 사이트 요청에는 쿠키를 전송하지 않지만 사용자의 편의성을 위해 예외를 허용합니다.- 전송되는 경우: 링크를 클릭한 이동이나,
<a>
태그를 통하여 이동 - 전송되지 않는 경우:
POST
요청,<img>, <script>, <iframe>
과 같은 임베디드 리소스 요청,XHR/FETCH
요청등이 있습니다.
- 전송되는 경우: 링크를 클릭한 이동이나,
SameSite=Strict
- 가장 엄격한 설정입니다. 쿠키가 동일한 사이트 내에서 요청만 전송되도록 합니다. CSRF 공격에 가장 강력한 보호 제공이지만 사용자 경험에 불편을 일으킬수 있습니다. (다른 사이트에서 링크를 클릭하여 돌아오면 다시 로그인)- 전송되는 경우: 사용자가 현재 보고있는 웹페이지와 동일한 도메인의 요청
- 전송되지 않는 경우: 모든 종류의 크로스 사이트 요청
SameSite=None
- 모든 크로스 사이트 요청에 쿠키를 전송하도록 허용합니다. 반듯이Secure
속성과 함께 사용되어야 합니다.- 전송되는 경우: 모든 크로스 사이트 요청 (임베디드 리소스, API 호출)
- 적합한 경우: 서드파티 위젯, 광고추적, Single Sign-On 과 같은 명시적으로 크로스 사이트 쿠키 전송이 필요한 경우
HttpOnly
- 쿠키가 클라이언트 측 JavaScript (브라우저 스크립트)에 의해 접근이 되는것을 방지합니다.HttpOnly
로 설정된 쿠키는document.cookie
와 같은 JavaScript API를 통해 읽거나 수정할수 없습니다. 오직 HTTP 요청을 통해서만 서버로 전송되고 서버에서만 설정할수 있습니다.XSS
공격을 방지 합니다. 악의적인 스크립트가 웹페이지에 주입 되었을때, 해당 스크립트가 세션ID 와 같은 민감한 정보를 훔쳐가는것을 방지합니다.
Secure
- 쿠키가HTTPS
를 통해서만 전송되도록 합니다.Secure
로 설정된 쿠키는 HTTP 연결을 통해서는 절대 전송되지 않습니다. 브라우저는 해당 쿠키를 암호화 되지 않는 HTTP 요청에 포함시키지 않습니다.- 웹사이트가
HTTPS
를 사용하고 있는 경우에만 유효합니다. HTTPS를 사용하지 않는 웹사이트에서는 이속성을 설정해도 의미가 없습니다.