쿠키의 필요성
개별 클라이언트의 여러 요청에 걸친 정보의 유지
HTTP Cookie
- 서버가 응답을 통해 웹 브라우저에 저장하는 이름+값 형태의 정보
- 웹 브라우저는 쿠키를 저장하기 위한 저장소를 가지고 있음
- 저장소는 자료의 유효기간과 접근 권한에 대한 다양한 옵션을 제공
쿠키 전송 절차
-
서버는 브라우저에 저장하고 싶은 정보를 응답과 같이 실어 보낸다 (Set-Cookie 헤더)
HTTP/1.1 200 OK
Set-Cookie: cookieName=cookieValue; Secure; Max-Age=60000
...
-
브라우저는 같은 서버에 요청이 일어날 때마다 해당 정보를 요청에 같이 실어서 서버에 보낸다 (Cookie 헤더)
GET / HTTP/1.1
Cookie: cookieName=cookieValue; anotherName=anotherValue
...
Set-Cookie Options
- Expires, Max-Age
- 쿠키의 지속 시간 설정
- Secure
- HTTPS를 통해서만 쿠키가 전송되도록 설정
- HttpOnly
- 자바스크립트에서 쿠키를 읽지 못하도록 설정
- Domain, Path
- 쿠키의 scope 설정 (쿠키가 전송되는 URL을 제한)
Express + Cookie
- 쿠키 읽기 - req.cookies
- 요청에 실려온 쿠키가 객체로 변환되어 req.cookies에 저장됨 (cookie-parser 미들웨어 필요)
- 쿠키 쓰기 - res.cookie(name, value)
- 쿠키의 생성 혹은 수정
JavaScript + Cookie
자바스크립트로도 쿠키를 읽고 쓰는 방법이 존재하지만, 보안 상 문제를 일으킬 수 있으므로 이런 접근 방식은 거의 사용되지 않는다.
자바스크립트에서 쿠키에 접근하지 못하도록 HttpOnly를 항상 설정하는 것이 best practice
쿠키의 한계점
- US-ASCII 밖에 저장하지 못함. 보통 percent encoding을 사용
- 4000 바이트 내외(영문 4000자, percent encoding 된 한글 444자 가량)밖에 저장하지 못함
- 브라우저에 저장됨. 즉, 여러 브라우저에 걸쳐 공유되어야 하는 정보, 혹은 웹 브라우저가 아닌 클라이언트(모바일 앱)에 저장되어야 하는 정보를 다루기에는 부적절