쿠키와 세션에 대해 알아보기 전에 HTTP의 특징에 대해서 알아보자.
HTTP
통신의 특징은 Connectionless(비 연결지향)
과 Stateless(상태 정보 유지 안함)
라고 할 수 있다.
클라이언트에서 서버에 요청을 보내면 서버는 클라이언트에 응답을 하고 연결을 끊는 특성이 있다.
HTTP는 TCP를 기반으로 동작한다. TCP가 전송이 끝나면 연결이 끊어지듯이 HTTP도 서로 전송이 끝나면 연결이 끊어진다. 그런데 매번 같은 주소로 요청을 할 때마다 새로 연결하고 끊어야 한다면 자원이 낭비되고 지연 시간도 발생한다.
위 문제를 방지하고자 HTTP1.1부터 Connection 헤더에 Keep-Alive를 설정하면 한 번 연결한 TCP 연결을 재사용하며 Keep-Alive 기능을 Default로 지원한다. 즉, Handshake 과정이 생략되므로 성능 향상을 기대 할 수 있다.
HTTP 통신은 요청을 응답하고 연결을 끊기 때문에 서버는 클라이언트의 상태 정보를 알 수 없다. 이를 stateless
라고 한다.
위 글에서 HTTP 통신은 stateless
라고 설명했는데, 만약 로그인을 하고 그 상태를 유지한 채로 웹 서비스를 제공하려면 어떻게 해야할지 생각해볼 필요가 있다. 다행히 HTTP 프로토콜에서 상태를 유지하기 위해서 쿠키와 세션이라는 방법을 제공한다.
쿠키는 어떤 웹 사이트를 방문할 경우, 그 사이트가 사용하는 서버가 클라이언트 로컬에 저장하는 key-value
쌍의 작은 데이터 파일이다. 클라이언트의 상태 정보를 저장해놓고 필요시 정보를 참조할 수 있다.
서버에서 클라이언트한테 쿠키를 저장하라고 요청할 때 Set-Cookie:키=값;옵션
을 사용한다. 만약 Set-Cookie:name=sangho
면 name 이라는 key
에 sangho 라는 value
를 저장한다. 옵션도 지정해서 보낼 수 있는데 자주 쓰이는 옵션을 아래와 같다.
세션 쿠키(session cookie)
라고 부른다.XSS를 막으려면 활성화
하는 것이 좋다.클라이언트에 총 300개의 쿠키 저장
이 가능하다.도메인 당 20개의 쿠키 저장
이 가능하다.하나의 쿠키는 4KB
까지 저장 가능하다.세션은 사용자 정보를 클라이언트 로컬에 저장하는 쿠키와 달리 세션은 서버 측에서 관리
한다. 웹 브라우저를 통해서 웹 서버에 접속한 시점부터 웹 브라우저를 종료하여 연결을 끝내는 시점까지 유지한다.
세션이 쿠키에 비해서 보안이 높지만 쿠키를 사용하는 이유는 세션은 서버에 저장되기 때문에 자원을 많이 차지하기 때문이다. 따라서 쿠키와 세션을 적절하게 병행하여 사용하면 자원의 낭비를 줄이고 웹 사이트의 속도를 높일 수 있다.