쿠키와 세션이 사용되는 이유?
HTTP 프로토콜은 Connectionless하고 Stateless한데 이러한 HTTP 프로토콜의 약점을 보완하고자 생겼다.
Connectionless :: 클라이언트가 request를 서버에 보내면 서버는 클라이언트에게 response를 한 후 접속을 끊는다.
Stateless :: 접속을 끊는 순간 클라이언트와 서버의 통신은 끝나고 통신중 생긴 상태 정보는 유지하지 않는다.
물론 Connectionless하고 Stateless하면 서버/클라이언트의 리소스 낭비를 줄일 수 있다는 큰 장점이 있다.
하지만 Connectionless, Stateless면 네이버 같은곳에서 로그인이 필요한 서비스가 있을 때 계속해서 로그인 해야하는 단점이 존재한다.
따라서 페이지를 새로 요청할 때마다 사용자 정보 기억 및 특정 데이터 유지를 위해 쿠키 / 세션이 이용된다.
쿠키(Cookie)
개념
- 쿠키는 클라이언트에 저장되는 키와 값이 들어있는 작은 데이터 파일이다.
- 쿠키는 이름, 값, 쿠키 저장기간, 경로 정보가 들어있다.
- 쿠키는 클라이언트의 상태 정보를 자신의 하드 디스크에 저장했다가 필요할 때 참조, 재사용 할 수 있다.
- HTTP 요청마다 메시지에 같이 실어 서버로 전달한다.
예시
어떤 사이트를 들어가면 '오늘 하루동안 이 창 보지 않기'같은 내용들을 볼 수 있고 체크를 하면 정말 하루동안 해당하는 팝업이 나타나지 않는다.
쇼핑몰의 장바구니는 쿠키를 이용하여 장바구니를 관리 할 수 있다.
원리
- 클라이언트가 브라우저로 웹페이지 접속
- 클라이언트가 요청한 웹페이지를 전송받으면서 쿠키를 하드에 저장
- 클라이언트 재 방문시 웹페이지 요청과 쿠키값을 전송
- 쿠키값을 이용하여 마치 계속해서 연결돼있는 것 처럼 사용 가능
장점
- 클라이언트에 저장하기에 서버의 공간을 절약 할 수 있다.
- 클라이언트에 저장되기에 서버에 요청시 세션보다 빠른 속도를 낸다.(세션은 서버에 저장되기에 서버의 처리를 거쳐야 한다.)
단점
- 요청시 쿠키 값을 그대로 보내기에 보안에 취약하다.
- 하나의 도메인당 20개 값, 클라이언트에 최대 300개 쿠키 저장 가능, 하나의 쿠키는 4kbyte가 최대 용량
- 웹브라우저마다 서로 다른 방식으로 쿠키 관리, 쿠키가 유연하지 못하다.
- 쿠키의 크기가 클 경우 네트워크 부하가 생긴다.
세션(Session)
개념
- 세션은 클라이언트와 웹서버 간 네트워크 연결이 지속적으로 유지되고 있는 상태를 의미한다.(클라이언트가 서버에 접속하고 접속을 종료 할 때 까지의 시점)
- 클라이언트가 서버에 request를 보내면 해당 서버가 클라이언트에게 ID를 발급해주는데, 이 ID가 세션이다.
- 세션 ID는 임시로 저장하여 페이지 이동 시 혹은 클라이언트가 재접속 했을 때 클라이언트를 유일하게 구분하는 수단이 된다.
원리
- 세션 ID를 클라이언트가 자신의 웹 사이트에 접속시 최초로 발급해준다.
- 서버에서 클라이언트로 발급해준 세션 ID를 클라이언트는 쿠키를 사용해서 저장한다.
- 클라이언트는 다시 접속할 때 메시지에 세션이 발급해준 쿠키를 이용하여 세션 ID값을 서버에 전달한다.
장점
- 각 클라이언트에게 고유 ID를 부여 할 수 있다.(유일성)
- 세션 ID로 클라이언트를 구분해서 클라이언트의 요구에 맞는 서비스 제공이 가능하다.
- 쿠키와 달리 서버에 저장하는 방식이므로 보안성이 있다.(최초 접속을 제외한 모든 상황에 SessionID 사용)
- 서버에 저장되기에 클라이언트 웹브라우저에 의존하지 않아도 된다.
- 데이터를 Hash Table에 저장하기에 많은 정보를 세션 객체에 저장 가능하다.
- SessionID만 보내기에 세션의 크기가 커도 네트워크 부하가 거의 없다.
단점
- 서버에 저장되기에 서버에 부하가 커진다.
정리
쿠키와 세션은 비슷한 역할을 하지만 저장되는 위치가 가장 큰 차이점이다.
(쿠키는 클라이언트에 저장, 서버는 서버에 저장)
쿠키와 세션중 뭐가 더 좋다고는 말할 수 없지만,
안전하게 이용하기 위해서는 세션을 이용하고
웹 서버에 공간이 부족할 경우, 다른 프로그램과 연동해야 할 경우에는 쿠키를 이용하는것이 유리하다.
'Applied > Network' 카테고리의 다른 글
빅 엔디안(Big Endian) 리틀 엔디안(Little Endian) 개념 (0) | 2018.10.21 |
---|---|
HTTPS, SSL(Secure Socket Layer) 개념 (0) | 2018.10.19 |
서브넷 마스크(Subnet Mask)와 서브넷팅 (4) | 2018.10.07 |
IPv4 주소체계와 클래스 구별법 (0) | 2018.10.07 |
TCP 통신 과정 및 비정상 종료(TCP 3,4-way handshake) (5) | 2018.10.01 |