javascript.info, https://ko.javascript.info/cookie
aaronddy.log, https://velog.io/@aaronddy/%EC%BF%A0%ED%82%A4%EC%99%80-%EC%84%B8%EC%85%98-cookie-session
그랩의 블로그, https://tansfil.tistory.com/58
참고 사이트에 내용을 개인적으로 복습하기 편하도록 재구성한 글입니다.
자세한 설명은 참고 사이트를 살펴보시기 바랍니다.
쿠키와 세션은 HTTP 프로토콜의 한계(Connectionless, Stateless)를 극복하기 위해 생긴 상태를 저장하기 위해 생긴 기술입니다.
쿠키는 브라우저에 저장되는 작은 크기의 문자열로, HTTP 프로토콜의 일부입니다.
쿠키는 주로 웹 서버에 의해 만들어집니다. 서버가 HTTP 응답 헤더의 Set-Cookie에 내용을 넣어 전달하면, 브라우저는 이 내용을 로컬에 저장합니다. 브라우저는 사용자가 쿠키를 생성하도록 한 사이트에 접속할 때마다 쿠키의 내용을 요청 헤더에 넣어서 함께 전달합니다.
document.cookie
프로퍼티를 이용해 브라우저에서도 쿠키에 접근 가능합니다.
쿠키는 최대 용량으로 약 4KB를 가지고, 키-값의 데이터와 옵션으로 path
, domain
, expires/max-age
, secure
를 설정할 수 있습니다.
path=/mypath
path
옵션을 지정한 경우, 지정한 경로나 지정한 경로의 하위 경로에 있는 페이지만 쿠키에 접근 가능합니다. 기본값은 현재 경로입니다.
path=/admin
으로 path
를 설정한 경우 /admin
과 /admin/something
에선 볼 수 있지만, /home
이나 /adminpage
에선 볼 수 없습니다. 특별한 경우가 아니라면, path
옵션을 path=/
와 같이 루트로 설정하여 모든 페에지에서 쿠키에 접근할 수 있도록 합니다.
domain=site.com
쿠키에 접근 가능한 도메인을 지정합니다. domain
옵션을 지정하지 않은 경우, 쿠키를 설정한 도메인을 제외하고 외부 도메인이나 서브 도메인에서 쿠키 정보를 얻을 수 없습니다. 예를 들면 news.site.com
이나 other.com
에서는 쿠키에 접속할 방법이 없습니다.
domain
옵션을 지정한다면 서브 도메인에서도 쿠키에 접근할 수 있습니다. 외부 도메인에서는 쿠키에 접근할 방법이 없습니다. 이런 제약사항은 안정성을 높이기 위함입니다.
expires=Tue, 19 Jan 2038 03:14:07 GMT
max-age=3600
위 두 옵션을 설정하지 않으면, 브라우저가 닫힐 때 쿠키가 삭제됩니다. 이러한 쿠키를 Session Cookie 라고 부릅니다.
위 두 옵션을 설정하면, 브라우저를 닫아도 설정한 시간만큼 쿠키가 유지됩니다. 이러한 쿠키를 Permanent Cookie 라고 부릅니다.
expires
옵션은 날짜로 만료 시간을 설정하고, 날짜는 반드시 GMT 포맷이어야 합니다. 이는 date.toUTCString
을 사용하여 해당 포맷으로 쉽게 변경 가능합니다. 과거 날짜를 입력 시 쿠키는 바로 삭제됩니다.
max-age
옵션은 숫자로 만료 시간을 설정하고, 초로 환산합니다. 0
이나 음수를 설정하면 쿠키는 바로 삭제됩니다.
secure
옵션의 경우 설정 시 HTTPS 프로토콜로 통신하는 경우에만 쿠키가 전송됩니다.
secure
옵션이 없으면, HTTP 프로토콜과 HTTPS 프로토콜 통신 모두 쿠키가 전송됩니다.
httpOnly
옵션은 웹서버에서 Set-Cookie 헤더를 이용해 쿠키를 설정할 때 지정할 수 있습니다. 이 옵션은 자바스크립트 같은 클라이언트 측 스크립트가 쿠키를 사용할 수 없게 합니다. document.cookie
를 통해 쿠키를 볼 수도 없고 조작할 수도 없습니다. 해커가 악의적인 자바스크립트 코드를 페이지에 삽입하고 사용자가 그 페이지에 접속하기를 기다리는 방식의 공격을 예방할 때 이 옵션을 사용합니다.
세션은 서버에 저장된 정보를 의미합니다. 이는 로그인을 이용해 쉽게 설명이 가능합니다. 사용자가 사용자 정보를 입력하여 로그인을 시도하면 서버는 사용자 정보를 데이터베이스에 존재하는지 확인한 후 사용자 정보에 대한 세션을 세션 저장소에 저장합니다.
이렇게 만들어진 세션에 접근하기 위한 열쇠로써 Session ID를 발급합니다. 이후 서버는 Session ID를 쿠키에 담아 클라이언트 측으로 보냅니다. 여기서 사용되는 쿠키는 일반적으로 expires/max-age
옵션을 지정하지 않은 Session Cookie(브라우저 종료 시 삭제되는 쿠키)입니다.
클라이언트 측은 브라우저가 종료될 때까지 Session ID를 지니고, 요청마다 Session ID가 담긴 쿠키를 서버로 보냅니다. 서버는 사용자 정보를 데이터베이스에서 확인할 필요 없이 세션 저장소에서 쿠키를 검증하여 유저 정보를 획득하고 이를 클라이언트에게 보내 로그인 상태를 유지합니다.