쿠키
- 웹사이트의 정보를 브라우저 쪽에 저장하는 작은 파일
- 쿠키의 경우, 서버가 클라이언트(브라우저)에 "이 파일을 보관해줘"라고 쿠키를 저장을 지시함
- 쿠키도 HTTP 헤더를 기반으로 구현됨
- 서버의 응답 헤더
Set-Cookie: LAST_ACCESS_DATE=Jul/31/2016
Set-Cookie: LAST_ACCESS_TIME=12:04
- 클라이언트는 이 값을 저장해 둠
- 다음번에 방문할 때는 다음과 같은 형식으로 보냄
Cookie: LAST_ACCESS_DATE=Jul/31/2016
Cookie: LAST_ACCESS_TIME=12:04
- 서버는 이 설정을 읽고, 클라이언트가 마지막으로 엑세스한 시간을 알 수 있음
- HTTP는 statelesss(언제 누가 요청해도, 요청이 같으면 결과가 같음)를 기본으로 개발됐지만, 쿠키를 이용하면 (중단 지점부터 작업을 재개하는 등) 서버가 상태를 유지하는 stateful처럼 보이게 서비스를 제공할 수 있음
쿠키의 문제들
- 영속성 문제
- 쿠키는 어떤 상황에서도 확실하게 저장되는 것은 아님(시크릿모드, 브라우저 보안설정에 따라서 세션이 끝나면 초기화되거나, 쿠키를 보관하라는 서버의 지시를 무시하기도 함, 방문기록 삭제 메뉴나 갭라자 도구 등으로 삭제되는 경우도 있음) 즉, DB 대신 쓸 수 있는 것은 아님
- 사라지더라도 문제가 없는 정보나, 서버 정보로 복원할 수 있는 자료를 저장하는 용도 적합
- 용량 문제
- 쿠키의 최대 크기는 4KB
- 쿠키는 헤더로서 항상 통신에 부가되므로 통신량이 늘어남 (요청/응답 속도 모두에 영향)
- 보안 문제
- secure 속성을 부여하면, https 프로토콜로 암호화된 통신에서만 쿠키가 전송됨
- http 통신에선느 쿠키가 평문으로 전송됨
- 매 요청시 쿠기가 송수신되 데, 보여선 곤란한 비밀번호 등이 포함되면 노출될 위험성이 있음
- 원리상 사용자가 쿠키를 수정할 수도 있음
쿠키에 제약을 주다
- 클라이언트는 서버가 보낸 쿠키를 로컬 스토리지에 저장하고, 같은 URL로 접속할 때 저장된 쿠키를 읽고 요청 헤더에 넣음
- 쿠키 보낼 곳을 제어하거나, 쿠키의 수명을 설정하는 등 쿠키를 제한하는 속성이 몇가지 정의되어 있음
- HTTP 클라이언트(브라우저)는 이 속성을 해석해 쿠키 전송을 제어할 책임이 있음
RFC 6265에 따른 쿠키
Set-Cookie: SID=31d4d96e407aad42; Path=/; Secure; HttpOnly
Set-Cookie: lang=en-US; Path=/; Domain=exmaple.com
- Expires, Max-Age 속성
- Domain 속성: 클라이언트에서 쿠키를 전송할 대상 서버. 생략하면 쿠키를 발행한 서버가 된다
- Path 속성: 클라이언트에서 쿠키를 전송할 대상 서버의 경로. 생략하면 쿠키를 발행한 서버의 경로
- Secure 속성: https로 프로토콜을 사용할 보안 접속일 때만 클라이언트에서 서버로 쿠키를 전송. 쿠키는 URL을 키로 전송을 결정하므로, DNS 해킹으로 URL을 사칭하면 의도치 않은 서버에 쿠키를 전송할 위험이 있다.
- HttpOnly 속성: 이 속성을 붙이면 자바스크립트 엔진으로부터 쿠키를 감출 수 있음(크로스 사이트 스크립팅 등 악의적인 자바스크립트가 실행되는 보안 위험에 대한 방어가 된다.)
- SameSite 속성: 이 속성은 RFC에 존재하지는 않음. 크롬 브라우저51에서 도입한 속성. 같은 origin의 도메인에게 전송하게 됨
Reference