인터넷상에서 사용자와 서버가 통신(요청 및 응답)할 때 HTTP Protocol을 사용하는데
HTTP 프로토콜의 특성이 있습니다. 바로 stateless라는 것인데요.
http의 stateless 특징으로 인해 한번 통신이 끝나면 연결을 유지하지 않습니다.
서버는 사용자를 기억하지 못합니다.
이렇게 서버가 사용자를 기억하기 위해 도입된 것이 쿠키와 세션입니다.
쿠키는 브라우저에 저장되는 String 형태로 구성된 키와 값이 들어가 있는 데이터 파일입니다.
브라우저마다 저장되는 쿠키는 다릅니다. 서버는 브라우저가 다르면 다른 사용자로 인식합니다.
Cookie's name: NID
Description:
The purpose of this cookie is to store information about your preferences.
Domain that they are sent from: google.com
Purpose: Preferences
Expiry date: 6 months
No exempt (from the duty of information and consent)
요청 헤더
부가적인 정보를 전달하는 HTTP 요청의 일종입니다.
사용자의 요청이므로 사용자에 대한 상세 정보를 포함한다고 볼 수 있습니다.
응답 헤더
부가적인 정보를 전달하는 HTTP 요청의 일종입니다.
응답에 대한 부가적인 정보를 포함합니다.
(1) Client → Server
클라이언트가 서버에 처음으로 Request 전송
(2) Server
서버에서 쿠키 생성
(3) Server → Client
HTTP 응답 헤더에 쿠키 포함시켜 응답
(4) Client
브라우저 종료되어도 쿠키 만료 기간 지나지 않았다면 클라이언트에서 보관
(5) Client → Server
같은 요청 하는 경우 HTTP 헤더에 쿠키 함께 보냄
(6) Server → Client
서버에서 쿠키를 읽어 이전 상태 정보를 변경할 필요 있을 때 쿠키 업데이트 하여
변경된 쿠키를 HTTP 헤더에 포함시켜 응답
1. 쿠키는 몇가지 특징이 있는데 쿠키는 도메인에 한정적입니다. 예를 들어 구글에서 사용자를 인식하기
위해 사용자에게 준 쿠키는 네이버에 보낼 수 없습니다. 구글의 쿠키는 사용자와 구글 안에서만 주고
받습니다.
2)
두번째 특징으로 쿠키는 자동으로 보내진다. 즉 사용자가 구글 페이지를 넘나들면 구글이 사용자
브라우저에 원하는 만큼 쿠키를 자동으로 보낸다.
이렇듯 쿠키는 사용자가 특정 사이트를 방문할 때 사용자의 브라우저에 저장되는 내용이다.
사용자의 편의를 위해 생겼고 누군가 조작해도 큰 상관 없는 내용들이 브라우저에 저장된다.
1.로그인 아이디 자동완성, 2.오늘 하루보지 않기, 3. 비로그인 회원으로 장바구니
담기 등이 있다. 4. ID 저장, 로그인 상태 유지 5. 스파르타 코딩 인증시 기억하기
특징
저장된 내용을 수정할 수 있다. 따라서 민감한 정보는 대상으로 적합하지 않다.
그래서 세션이 필요하게 되었다.
세션은 웹에서 사용자와 서버간 일정시간 동안의 통신을 의미합니다. stateless를 극복하기 위한
세션의 통신이 쿠키와 다른 점은 사용자를 식별하기 위해 필요한 정보를 서버에 저장한다는 것입니
다.
전에 민감한 정보를 위해 세션이 필요하게 되었다고 했으니 세션동작 방식을 예시를 통해 살펴
보겠습니다.
로그인 상황
사용자가 post 요청으로 네이버에 아이디와 비밀번호를 입력했다고 합시다.
서버쪽에서는 사용자가 입력한 아이디와 패스워드를 가지고 내부 데이터베이스와 매칭이되면
로그인이 성공이됩니다.
로그인 성공 시 세션이 만들어지고 세션에는 session ID, User ID 권한 ... 항목이 생성 되면고
response 때 Cookie에 Session ID를 실어서 보내게됩니다. 이 세션아이디가 쿠키를 통해 보내져서
다시 요청이들어올 때 세션아이디를 통해 서버상에 있는지 없는지에 따라 사용자에게 다른 페이지를 보
여주게 됩니다.
쿠키에 세션아이디가 담겨져 있으므로 로그인 상태에서 특정 웹사이트의 쿠키를 모두 지우고
새로고침하면 로그아웃된다. 쿠키에 세션 아이디가 없으므로 서버는 로그인하지 않은 페이지
를 보여주게된다.
(1) Client → Server
클라이언트가 처음으로 서버에게 request 전송
(첫 request이므로 session id 존재하지 않음)
(2) Server → Client
서버가 session id가 없음을 확인하고 새로 발급하여 응답. 발급 id는 사용자별로 유니크
한 아이디를 발급한다.
(3) Client → Server
HTTP 헤더에 session id 포함시켜 요청
(4) Server
서버는 session id를 통해 사용자 식별
(5) 클라이언트 종료 시 session id 제거, 서버에서도 session 제거
사용 예시
- 로그인
세션의 장점
로그인된 유저의 정보를 저장. 따라서 원하지 않은 사용자가 있을 때 세션에서 제거해서 사용자를 관
리할 수 있다. 예시로 넷플릭스의 1계정의 접속기기를 제한하는 것은 세션이 있어서 가능하다.
세션의 단점
사용자가 많을시 db를 구축해야한다. 왜냐하면 사용자의 수만큼 서버에 데이터를 저장해야 하기 때문
이다.
위의 특징으로 session id를 포함한 쿠키를 담은 request response header가 요청과 응답시 왔다
갔다 하면서 db를 조회하므로 서버에 부하가 생길 수 있다.
쿠키와 세션은 비슷한 역할을 합니다. 도식도 유사합니다.
차이점은 사용자의 정보가 저장되는 위치입니다. 쿠키는 브라우저가 지정한 메모리 또는 하드디스크에
저장되고 세션은 서버의 메모리에 저장됩니다.
서버에 저장된다는 특징으로 서버의 자원을 사용해 서버의 메모리로 로딩되기 때문에 서버의 부하를 생각
해서 필요한 경우에 세션을 사용합니다.
쿠키에는 만료시간 있는 파일로 저장 돼서 브라우저가 종료 돼도 정보가 남아 있습니다.
세션은 브라우저가 종료되면 만료시간 상관없이 삭제됩니다.
Q. 왜 http는 stateless로 설계되었을까?
stateless protocol은 리소스가 적게 든다.
패킷 전송이 독립적이고 빠르다.
서버 구조가 단순하다.
stateful protocol을 사용하는 서비스 FileZila가 인터넷을 통해 빠른 파일 전송
을 위한 목적으로 사용한다고 생각했을 때 stateful의 필요성을 짐작해 볼 수 있다.
Q. 서버는 어떻게 쿠키를 활용해서 사용자를 분석할까?
Q. 코드상으로 request headers와 response headers는 어떻게 만드는 것일까?
Q. 세션아이디는 쿠키와 함께 보내진다고 하는데 그 속에서 어떻게 확인할 수 있을까?
Q. 세션 id는 찾아내도 암호화 되어 있어 괜찮은가?
출처
https://medium.com/@maheshlsingh8412/cookie-session-story-of-a-stateless-http-3cd09cc01541
https://interconnection.tistory.com/74
https://velog.io/@serinyoon/Server-Session-Cookie
https://devuna.tistory.com/23
쿠키 만들기
쿠키 정책 엿보기
쉽게 이해하는 쿠키 동영상(Nomad Coders1)
쿠키 세션 동영상 (Nomad Coders2)