[Youtube 클론코딩] 쿠키와 세션
HTTP 프로토콜의 특징
앞서 해시함수를 통해 비밀번호를 암호화해서 저장하고, bcypt.compare() 메소드를 통해 로그인하는 기능을 구현했었다.
그렇지만 지금은 다른 페이지로 이동하면 로그인 정보가 삭제되어 다시 새로 로그인을 해야하는 번거로움이 존재한다.
이게 바로 HTTP 프로토콜의 특징이다.
1. Connectionless 프로토콜 (비연결지향)
클라이언트가 서버에 페이지를 요청(Request)하면,
서버는 그에대한 응답(Response)을 보낸 뒤 클라이언트와의 연결을 끊는다.
- HTTP 1.1 버전에서 연결을 유지하고, 재활용 하는 기능이 Default로 추가되었다.
(keep-alive 값으로 변경 가능)
2. Stateless 프로토콜 (상태정보 비유지)
클라이언트의 상태 정보를 서버가 가지고있지 않는 방식이다.
이전 통신에서 정보를 주고받았다고 해도 새로운 통신에 이전 정보를 이용하지 않는다.
즉, 우리가 로그인을 하더라도 새로운 페이지를 요청하게 되면, 이전에 로그인 했던 정보를 이용하지 않는다는 것이다.
쿠키와 세션
위의 Stateless 프로토콜을 극복하기위해 만들어진 개념이 바로 쿠키와 세션이다.
쿠키
쿠키는 웹 서버가 브라우저에게 발급하는 일련의 정보 파일이다.
클라이언트 사이드(사용자 PC)에 저장되며, 클라이언트의 상태정보를 가지고있어 필요 시 저장된 정보를 활용할 수 있다.
쿠키의 특징
1. 이름, 값, 만료일(저장 기간 설정), 경로 정보 로 구성.
2. 클라이언트에 총 300개의 쿠키를 저장할 수 있다.
3. 하나의 도메인 당 20개의 쿠키를 가질 수 있다.
4. 하나의 쿠키는 4kb(=4096byte)까지 저장할 수 있다.
동작 순서
1. 클라이언트가 서버에 접근하여 페이지 요청.
2. 웹 서버가 쿠키 생성
3. 생성한 쿠키에 클라이언트 상태정보를 저장해 페이지 정보와 함께 돌려줌
4. 클라이언트는 받은 쿠키를 브라우저(로컬 PC)에 저장했다가 다시 서버에 요청할 때 같이 넘겨준다.
5. 서버에서 쿠키를 받아 정보를 활용할 수 있다.
사용 예시
1. 로그인 정보(ID, PW) 저장하기
2. 팝업 창의 '오늘은 다시 보지 않기' 기능
세션
세션이란, 일정 시간동안 같은 사용자(브라우저)에게 받는 요청들을 하나의 통신으로 간주하는 기술이다.
(일정 시간은 웹 브라우저가 서버에 접속한 시점부터 브라우저를 종료한 시점을 의미한다.)
특징
1. 웹 서버에 클라이언트에 대한 세션 정보를 저장한다.
2. 브라우저를 닫거나, 서버에서 세션을 삭제했을 때 삭제되므로 쿠키보다 보안이 좋다.
3. 서버 용량이 허용하는 한, 저장 데이터 용량에 제한이 없다.
4. 각 클라이언트 마다 고유 Session ID를 부여한다.
동작 순서
1. 클라이언트가 서버에 접근하여 페이지 요청
2. 서버는 접근한 클라이언트의 Request.headers.cookie에서 클라이언트의 session-id가 존재하는지를 확인
3. session-id가 존재하지 않는다면, 서버는 session-id를 생성해 클라이언트에게 페이지와 함께 쿠키로 돌려줌
4. 생성된 session-id는 sessionStore의 sessions에 저장됨.
5. 클라이언트는 재접속 시 해당 쿠키를 이용해 session-id를 서버에 전달함
사용 예시
1. 로그인 시, 페이지 전환에도 로그인이 계속 유지됨.
쿠키와 세션 차이점
쿠키(Cookie) | 세션(Session) | |
저장 위치 | 클라이언트(=접속자 PC) | 웹 서버 |
저장 형식 | String | Object |
만료 시점 | 쿠키 저장시 설정 (브라우저가 종료돼도, 만료 시점이 지나지 않으면 자동삭제되지 않음) |
브라우저 종료 시 삭제 (기간 지정 가능) |
사용하는 자원 | 클라이언트 리소스 | 웹 서버 리소스 |
용량 제한 | 총 300개 하나의 도메인 당 20개 하나의 쿠키 당 4KB(=4096byte) |
서버 용량에 따름 |
속도 | 세션보다 빠름 | 쿠키보다 느림 |
보안 | 세션보다 나쁨 | 쿠키보다 좋음 |