쿠키
: 인터넷 사용자가 웹 사이트를 방문하면(요청을 보내면) 그 사이트의 서버에서 인터넷 사용자의 해당 브라우저에 저장하는 작은 기록 정보.
GET /me
와 같은 요청을 보내면 서버 입장에서는 내가 누군지 알 수가 없는데, 이 때 HTTP request 쿠키에 나에 대한 정보를 담아 보내, 서버에서 파악하도록 한다.
1
2
3
4
// github의 set-cookie 응답 헤더
set-cookie: has_recent_activity=1; path=/; expires=Tue, 15 Feb 2022 14:54:36 GMT; secure; HttpOnly; SameSite=Lax
// github에서의 cookie 요청 헤더
cookie: user_session=avhAggsHduFqr2CJV-llWc6fX-I4iAO2oadXFJ1x46_if_iX; __Host-user_session_same_site=avhAggsHduFqr2CJV-llWc6fX-I4iAO2oadXFJ1x46_if_iX; logged_in=yes; dotcom_user=hungryjayy; _device_id=9201e5493cfb21d6e366550217400b15; _octo=GH1.1.177507419.1640739867; color_mode={"color_mode":"light","light_theme":{"name":"light","color_mode":"light"},"dark_theme":{"name":"dark","color_mode":"dark"}}; tz=Asia/Tokyo; has_recent_activity=1; _gh_sess= ~~~... 이하 생략
특징
Key-value 쌍을 이루는 4KB의 작은 정보.
- 성능 저하의 원인: 동일한 서버에 재 요청시 매 요청마다 서버로 쿠키를 함께 전송하기 때문에, 크면 오버헤드일 수 있음
- Expires: 유효기간 존재
- 유효기간이 존재하는 쿠키는 대부분 브라우저에 저장한다.
- Stateless인 HTTP 프로토콜에서 stateful하게 만들어주는 역할을 하고 다양한 용도로 사용된다.
- 세션 관리: 로그인 정보, 장바구니
- 개인화: 사용자 선호, 테마 세팅 등
- 트래킹: 사용자 행동 분석
취약점
- 보안: 위 실제 요청을 참고해보면, 쿠키는 암호화하지 않고 클라이언트 정보를 그냥 저장한다. JWT 토큰은 서버의 비밀키를 통해 토큰값 자체를 암호화해서 클라이언트 브라우저에 저장하도록 한다는 점에서 보안의 차이가 있다.
- Persistent 쿠키(지속 쿠키): 세션 쿠키와
Expires
옵션에서 차이가 있다.- 지속 쿠키는 하드에 저장한다. 공용 PC에서 하드에 저장된 cookie 정보를 쉽게 얻어낼 수 있다.
- XSS 공격(크로스 사이트 스크립팅): 네트워크를 통해 전송되는 쿠키를 암호화하지 않으면 네트워크 스니핑 공격(데이터 도청)(=세션 하이재킹 같은 것)을 통해 쿠키를 탈취 가능하다.
- 스니핑을 막기 위해 위의 예시처럼 HttpOnly 옵션을 사용한다. 이걸 통해 브라우저 코드(스크립트)로 해당 쿠키로 접근 불가능하게 한다.
Secure cookie
- HTTPS를 통해 쿠키 또한 암호화 될 수 있다.
- 개발자의 실수로 HTTP를 전송하는 경우가 있을 수 있는데,
Set-Cookie
헤더에 secure 옵션을 주면 HTTPS가 아닌 통신에서 쿠키를 전송하지 않도록 막을 수 있다.
Reference)
https://it-eldorado.tistory.com/90
https://tristan91.tistory.com/521
https://nsinc.tistory.com/121
https://blog.naver.com/PostView.nhn?blogId=dlaxodud2388&logNo=221917137726
https://junwoo45.github.io/2019-05-17-%EB%A1%9C%EC%BB%AC_%EC%84%B8%EC%85%98%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80_%EC%BF%A0%ED%82%A4/