오늘은 쿠키와 세션에 대해 알아보도록 하겠습니다.
# HTTP 특징
앞서 쿠키와 세션을 이해하기 위해선 HTTP 프로토콜의 특성을 이해해야 합니다.
HTTP(HyperText Transfer Protocol)는 ‘Connectionless, Stateless’한 특성을 가지는데, 이러한 특성을 보완하기 위해 쿠키와 세션을 사용하기 때문입니다.
먼저 HTTP란 HTML 문서 파일과 같은 리소스를 가져올 수 있도록 해주는 프로토콜입니다. Web에서 이루어지는 클라이언트와 서버 간의 모든 데이터 요청과 응답은 HTTP를 통해 이루어집니다.
•
HTTP 특성
1.
Connectionless
a.
클라이언트가 서버에게 요청을 한 후 서버에게로 부터 응답을 받으면 그 후 바로 연결을 끊어 버리는 특징입니다.
예를 들어, 클라이언트(브라우저)가 데브피플 서버에게 “데브피플 홈페이지 정보 갖다줘"라고 하면 데브피플 서버는 클라이언트에게 데브피플 홈페이지에 대한 정보를 보내준 후 통신 접속을 끊게 됩니다.
2.
Stateless
a.
클라이언트와 서버의 통신이 끝나면 해당 상태를 유지하지 않는 특징입니다. 연결을 끊는 순간 클라리언트와 서버의 통신은 완전히 끝나며 기존의 상태에 대한 정보는 유지하지 않습니다.
예를 들어, 앞서 든 예시와 같이 클라이언트가 서버에게 홈페이지 정보를 요청하고 서버가 이에 응답한 다음 해당 상태에 대한 정보를 유지하지 않습니다. 즉, 클라이언트와 서버가 서로 정보를 주고 받았던 상태를 전혀 기억하지 못한다는 것이죠.
이러한 HTTP 특성을 바로 쿠키와 세션으로 보완할 수 있습니다. 만약 쿠키와 세션을 사용하지 않으면 HTTP의 특성으로 인해 사용자가 웹사이트에 로그인한 후에도 매 페이지 이동 시 마다 계속 다시 로그인을 해야 하는 매우 불편한 상황이 발생될 것입니다. 바로 HTTP는 ‘Connectionless, Stateless’한 특성을 지녔으니까요!
# 쿠키 (Cookie)
쿠키란 클라이언트(브라우저) 로컬에 저장되는 키와 값이 들어있는 작은 데이터 파일입니다. 쿠키 파일에 대한 유효 기간을 사용자가 임의대로 명시할 수 있고, 브라우저가 종료되어도 유지된다는 특징이 있습니다.
또한 사용자가 따로 요청하지 않아도 브라우저는 서버에 Request(요청)할 때에 Request Header에 쿠키를 넣어서 자동으로 전송합니다. 브라우저에 하나의 쿠키는 최대 4KB까지 저장 가능합니다.
쿠키의 예시로는 인터넷 쇼핑몰의 장바구니 기능 또는 자동로그인 체크 기능 등이 있습니다.
# 세션 (Session)
세션은 쿠키를 기반으로 하며 정보 파일을 서버 측에서 관리합니다. 서버에서는 클라이언트를 구분하기 위해 세션 ID를 발급하여 브라우저가 서버에 접속 후 브라우저를 종료할 때까지 정보 파일을 유지합니다.
물론 세션도 쿠키와 같이 사용자가 임의대로 유효기간을 명시할 수 있습니다. 정보를 브라우저가 아닌 서버에서 가지고 있기 때문에 쿠키보다 보안은 좋지만, 동시 접속 사용자가 많아질수록 서버의 메모리를 많이 사용함으로서 성능 저하의 요인이 될 수 있습니다.
세션의 예시로는 로그인과 같이 보안상 중요한 작업을 수행할 할 때 사용됩니다.
# 쿠키와 세션의 차이점
쿠키와 세션의 가장 큰 차이점은 ‘정보 파일이 어디에 저장되는냐’입니다. 쿠키는 브라우저 로컬에 저장되며, 세션은 서버에 저장됩니다. 쿠키는 서버의 자원을 사용하지 않으면 세션은 서버의 자원을 사용합니다.
그리고 쿠키는 요청 속도가 세션보다 빠른데 이는 세션은 서버의 처리 과정이 필요로 하기 때문이다. 대신 서버는 쿠키에 비해 보안 면에선 더 우수합니다. 정보 파일 자체를 브라우저 로컬에 저장하는 쿠키는 변질의 우려가 있으나, 세션은 쿠키를 이용해서 sessionID만 저장해 클라이언트를 구분하고 실제 정보 파일은 서버에 저장되기 때문에 비교적 더 보안성이 높은 것이죠.
또한 쿠키를 사용하면 서버 리소스를 절약할 수 있어서 전반적인 서비스 성능 향상을 꾀할 수 있습니다. 마지막으로, 쿠키는 브라우저를 종료해도 계속 정보가 남아 있을 수 있는 반면 세션은 브라우저가 종료되면 정보가 사라집니다.
따라서 내가 저장하고자 하는 정보 파일이 보안이 좀 더 중요한지 아님 전반적인 서비스 서버의 성능 속도가 중요한지 등을 고려해 쿠키나 세션을 사용하면 좋을거 같습니다.