쿠키(Cookie)란?
쿠키는 클라이언트(로컬)에 저장되는 키와 값이 들어있는 작은 데이터 파일이다. 이러한 쿠키는 클라이언트에 저장되어 필요시 정보를 참조하거나 재사용할 수 있다.
보통 웹 환경에서는 클라이언트와 서버가 HTTP 프로토콜을 이용해 통신한다.
하지만 HTTP 프로토콜은 아래와 같은 특징을 가지기 때문에 쿠키를 사용한다.
1. Connectionless(비연결성)
-> HTTP는 TCP 연결을 맺고 요청(Request)을 보내면 서버는 응답(Response)을 보내고 연결이 끊어진다.
물론 HTTP 1.1 버전은 커넥션을 계속 유지하는 keep-alive 옵션이 디폴트이긴 하다.
하지만 HTTP 1.0 버전은 기본적으로 connectionless이다.
참고)
2. Stateless(무상태)
-> HTTP는 상태를 따로 저장하지 않는다. 즉, 연결이 끊어지는 순간 모든 상태 정보가 사라지게 된다.
따라서 서버는 클라이언트가 첫 번째 통신 때 보낸 정보를 두 번째 통신 때 알 수 없다.
이러한 HTTP의 특성 때문에 쿠키가 사용된다.
쿠키는 다음과 같이 구성 되었다.
- 이름 : 쿠키를 구별하는 이름
- 값 : 쿠키에 저장되는 값
- 유효시간 : 큐키 유지시간
- 도메인 : 쿠키를 전송할 도메인
- 경로 : 쿠키를 전송할 요청 경로
쿠키의 동작 방식을 예를 들어 살펴보자.
1. 클라이언트(웹 브라우저)가 서버에 로그인을 요청한다고 하자.
서버는 클라이언트의 요청을 받고 클라이언트의 정보를 담은 쿠키를 생성한다.
이후 HTTP 헤더에 set-cookie 옵션을 통해 쿠키를 포함해 응답을 보낸다.
클라이언트는 해당 쿠키를 쿠키 저장소에 저장해 놓는다.
클라이언트가 로그인을 완료하고 첫 페이지인 welcome 페이지에 접근한다고 하자.
이때 클라이언트는 쿠키 저장소에서 쿠키를 꺼내 HTTP 요청에 쿠키를 담아 전송한다.
그럼 서버는 HTTP 요청의 쿠키를 읽어 클라이언트를 식별할 수 있다.
만약 쿠키가 없었다면 다시 로그인 정보를 보내야 하는 불상사가 일어났을 것이다.
세션(Session)이란?
세션은 일정 기간 동안 같은 사용자(클라이언트)로 부터 들어오는 일련의 요구를 하나의 상태로 보고 그 상태를 일정하게 유지시키는 기술이다.
세션은 쿠키를 기반으로 하지만 쿠키와 다르게 서버 측에서 저장하고 관리한다.
서버는 세션 ID를 이용해 클라이언트를 구분하며, 웹 브라우저가 서버에 접속해 브라우저를 종료할 때까지 세션을 유지한다.
이러한 세션의 동작 방식을 예를 들어 살펴보자.
클라이언트(웹 브라우저)가 서버에 로그인을 요청한다고 하자.
서버는 클라이언트의 요청을 받고 클라이언트의 정보를 담은 세션을 생성한다.
이후 세션 ID를 담은 쿠키를 생성하고, HTTP 헤더에 set-cookie 옵션을 통해 쿠키를 포함한 응답을 보낸다.
클라이언트는 해당 쿠키를 쿠키 저장소에 저장해 놓는다.
클라이언트가 로그인을 완료하고 첫 페이지인 welcome 페이지에 접근한다고 하자.
이때 클라이언트는 쿠키 저장소에서 쿠키를 꺼내 HTTP 요청에 쿠키를 담아 전송한다.
그럼 서버는 HTTP 요청의 쿠키를 읽어 쿠키 안의 세션 ID를 이용해 클라이언트를 식별할 수 있다.
쿠키와 세션의 차이
쿠키와 세션의 동작방식을 보면 어떤 차이가 있는지 알 수 있을 것이다.
- 쿠키는 클라이언트에 저장되지만, 세션은 서버에 저장된다.
- 세션은 서버에 저장되므로 서버의 자원을 사용한다.
- 반면 쿠키는 클라이언트에 저장되므로 서버의 자원을 사용하지 않는다는 이점이 있다.
- 서버에 요청을 보내는 사용자가 많을 경우 세션은 부하가 심할 수 있다.
- 보안면에서 세션이 더 우수하다. 쿠키는 정보를 직접 저장하고 요청을 보낼 수 있다. 만약 쿠키에 사용자의 주민번호 같은 민감한 정보를 그대로 담아 HTTP 요청을 보낸다고 하자. 이때 중간에 정보를 스니핑 당할 수도 있다.
- 세션은 쿠키를 이용해 쿠키에 세션 ID만 저장하고 서버에서 세션을 처리하기 때문에 비교적 보안성이 좋다.
- 쿠키는 만료시간 동안 파일로 저장되므로 브라우저를 종료해도 정보가 남아있다.
- 세션은 브라우저가 종료되면 만료시간에 상관없이 삭제된다.
'Back-End > [Web]' 카테고리의 다른 글
[Web] HTTP 1.1과 2.0의 차이, HTTP 1.0 vs HTTP 1.1 vs HTTP 2.0 (0) | 2023.06.28 |
---|---|
[Web] 웹소켓(WebSocket)이란? 웹소켓과 HTTP의 차이 (0) | 2023.03.16 |
[Web] HTTP 헤더란? HTTP 헤더에 담긴 정보 (0) | 2022.08.09 |
[Web] HTTP 상태코드란? 404 Not Found란? (0) | 2022.08.05 |
[Web] MVC 패턴이란? MVC 패턴의 등장 배경 (0) | 2022.05.11 |