쿠키와 세션의 개념을 알아보기 이전에 쿠키와 세션을 사용하는 이유가 무엇인지 알아보자.
쿠키와 세션을 사용하는 이유는 HTTP 프로토콜의 특징이자 약점을 보완하기 위해서 사용한다.
HTTP는 이 두 가지 특성을 보완하기 위해서 쿠키와 세션을 사용하게 되었다.
비연결지향이라는 특성 덕분에 계속해서 커넥션을 유지하지 않기 때문에 서버 리소스 낭비가 줄어드는 것은 아주 큰 장점이지만, 통신할 때마다 새로 커넥션을 만들기 때문에 클라이언트 측면에서는 상태를 유지하기 위해 통신할 때마다 어떤 절차를 가져야 하는 단점이 생긴다. 만약 쿠키와 세션이 없다면 어떤 페이지에서 다른 페이지로 넘어갈 때마다 인증을 다시 받아와야하는 것이다.
쿠키는 클라이언트 로컬
에 저장되는 키와 값이 들어있는 작은 데이터 파일이다.
쿠키는 서버에서 HTTP Response Header에 Set-Cookie 속성을 이용하여 클라이언트에 쿠키를 제공한다.
쿠키에는 이름, 값, 만료 날짜/시간(쿠키 저장기간), 경로 정보 등이 들어있다. 쿠키는 클라이언트의 상태 정보를 로컬에 저장했다가 요청(Request)할 때 참조된다. 쿠키는 서버측에서 만료 날짜/시간을 지정하여 정해진 시간동안 데이터(상태 정보)를 유지할 수 있다.
이는 로그인 상태 유지에 활용된다.
쿠키는 세션 쿠키
와 지속 쿠키
로 나뉜다.
만료 날짜/시간을 지정하지 않으면 항상 우지하라는 것으로 판단하고 지속 쿠키에 저장되고, 만료 날짜/시간을 지정하면 세션 쿠키로 저장된다.
세션 쿠키는 브라우저 메모리에 저장되므로 브라우저가 종료되면 쿠키는 사라지게 된다. 지속 쿠키는 파일로 저장되므로 브라우저가 종료되어도 쿠키는 남아있게 된다.
참고로 세션 쿠키의 값은 보안상 꽤나 안전한 브라우저의 메모리에 저장되기 때문에 보안에 유리하지만 파일로 저장되는 지속 쿠키의 경우 비교적으로 보안에 취약하다.
쿠키 프로세스
쿠키 사용 사례 : 자동 로그인, 오늘하루 이 창을 보지 않음, 장바구니...
쿠키의 한계
쿠키는 사용자가 별도로 요청하지 않아도 브라우저(클라이언트)에서 서버에 요청시에 Request Header에 쿠키 값을 넣어 요청한다.(= 자동이다.)
그렇다고 그 많은 쿠키 값을 굳이 모든 요청에 넣어서 비효울적으로 동작하지는 않는다. 도메인 설정을 통해서 지정한 도메인으로 요청할 때만 쿠키 값이 제공되도록 할 수도 있다.
서버에 클라이언트의 상태 정보를 저장하는 기술로 논리적인 연결을 세션이라고 한다.
웹 서버에 클라이언트에 대한 정보를 저장하고 클라이언트에게는 클라이언트를 구분할 수 있는 ID를 부여하는데 이것을 세션아이디라고 한다.
결과적으로 세션을 통해 클라이언트의 정보는 서버에 두고, 세션 아이디를 이용해서 인증받고 정보를 이용하는 방식이다.
저장 위치
쿠키는 클라이언트(브라우저)에 메모리 또는 파일에 저장하고, 세션은 서버 메모리에 저장된다.
보안
쿠키는 클라이언트 로컬에 저장되기도 하고 특히 파일로 저장되는 경우 탈취, 변조될 위험이 있고, Request/Response에서 스나이핑 당할 위험이 있어 보안이 비교적 취약하다. 반대로 Session은 클라이언트 정보 자체는 서버에 저장되어 있으므로 비교적 안전하다.
라이프 사이클
쿠키는 앞서 설명한 지속 쿠키의 경우에 브라우저를 종료하더라도 저장되어 있을 수 있는 반면에 세션은 서버에서 만료 날짜/시간을 정해서 지워버릴 수 있기도 하고 세션 쿠키에 세션 아이디를 정한 경우, 브라우저 종료시 세션 아이디가 날아갈 수 있다.
속도
쿠키에 정보가 있기 때문에 서버에 요청시 헤더를 바로 참조하면 되므로 속도에서 유리하지만, 세션은 제공받은 세션아이디(key)를 이용해서 서버에서 다시 데이터를 참조해야 하므로 속도가 비교적 느릴 수 있다.
세션은 서버에 데이터를 저장 즉, 서버의 자원을 사용하기 때문에 서버 자원에 한계가 있고 메모리를 사용하다보면 속도 저하도 올 수 있기 때문이다.
브라우저 캐시는 이미지나 css, js파일 등이 사용자의 브라우저에 저장이 되는 것이다. 이를 이용해 같은 자원을 로드해야할 때, 해당 자원을 다시 불러오지 않고 캐시되어 있는 자원을 써서 클라이언트 자원을 아끼는 것이다.
해당 자원이 한 번 브라우저 캐시에 저장되면 다음 필요시에도 브라우저에 있는 걸 재사용하기 때문에 경우에 따라 해당 자원이 변경되어도 변경된 자원을 참조할 수 없는 경우가 생길 수 있다.
따라서 사용자는 브라우저 캐시를 지워주거나 서버에서 클라이언트로 응답을 보낼 때 header에 자원 캐시 만료시간을 명시하는 방법 등을 이용하여 캐시를 회피할 수 있다.
보통 쿠키와 세션의 차이를 물어볼 때, 저장위치나 보안에 대해서는 대체적으로 대답을 잘 한다. 그런데 라이프 사이클에 대해서 얘기하지 않는 경우는 많은데 이런 것까지 디테일하게 대답해주는게 좋지 않을까한다.
추가적으로 이론적인 내용뿐만 아니라 실제 사용해보고 사례를 언급하면 더 좋을 것이라고 생각한다.