쿠키와 세션은 누구나 한번쯤은 들어본 단어일 것이다.
하지만 그 개념에 대해서는 헷갈리는 경우가 많아 간단하게 정리해보려고 한다.
HTTP에서 쿠키와 세션을 사용하는 이유
HTTP 프로토콜의 특징이자 약점을 보완하기 위해 쿠키 또는 세션을 사용한다.
현재 우리가 인터넷에서 사용하고 있는 HTTP 프로토콜 환경은 connectionless, stateless한 특징을 가지기 때문에 서버는 클라이언트가 누구인지 매번 확인해야 한다는 문제가 있다.
이러한 문제를 해결하기 위해 쿠키와 세션을 사용한다.
예를 들어 쿠키와 세션을 사용하지 않고 HTTP 연결만으로 사이트를 구성한다면,
쇼핑몰에 옷을 구매하기 위해 로그인을 했음에도 페이지를 이동할 때 마다 로그인 정보가 유지되지 않아 계속 다시 로그인을 해야 한다.
따라서 HTTP 프로토콜을 이용하게 되는 웹사이트에서 웹페이지에 특정 방문자가 머무르고 있는 동안에 그 방문자의 상태를 지속시키기 위해 쿠키와 세션을 이용한다.
connectionless (비연결지향)
클라이언트가 요청을 한 후 서버에게 응답을 받으면 연결을 끊는 처리방식이다.
HTTP는 클라이언트가 request를 서버에 보내면, 서버는 클라이언트에게 요청에 맞는 response를 보내고 접속을 끊는다.
stateless (상태정보 유지 안함)
클라이언트의 상태 정보를 가지지 않는 서버 처리 방식이다.
클라이언트와 첫번째 통신에서 데이터를 주고 받았다 해도, 두번째 통신에서 이전 데이터를 유지하지 않는 특징이다.
연결을 끊는 순간 클라이언트와 서버의 통신이 끝나며 상태 정보를 유지하지 않는다.
쿠키 (Cookie)
쿠키란?
- 쿠키는 클라이언트(브라우저)에 저장되는 키와 값이 들어있는 작은 데이터 파일이다.
- 사용자 인증이 유효한 시간을 명시할 수 있으며, 유효 시간이 정해지면 브라우저가 종료되어도 인증이 유지된다는 특징이 있다.
- Response Header에 Set-Cookie 속성을 사용하면 클라이언트에 쿠키를 만들 수 있다.
- 쿠키는 사용자가 따로 요청하지 않아도 브라우저가 Request시에 Request Header를 넣어서 자동으로 서버에 전송한다.
쿠키 동작 방식
- 클라이언트가 페이지를 요청
- 서버에서 쿠키를 생성
- HTTP 헤더에 생성한 쿠키를 포함시켜 클라이언트에게 응답
- 브라우저가 종료되어도 쿠키 만료 기간이 있다면 클라이언트 쪽에서 쿠키를 보관하고 있음
- 같은 요청을 할 경우 HTTP 헤더에 쿠키를 함께 보냄
- 서버에서는 쿠키를 읽어 이전 상태 정보를 변경할 필요가 있을 경우에 쿠키를 업데이트해서 변경된 쿠키를 HTTP 헤더에 포함시켜 응답
쿠키 사용 예시
- 방문 사이트에서 로그인 시, "아이디와 비밀번호를 저장하시겠습니까?" 체크
- 쇼핑몰 장바구니 기능
- 자동 로그인
- 팝업창에 "오늘 더이상 이 창을 보지 않음" 체크
세션 (Session)
세션이란?
- 세션은 쿠키를 기반으로 하지만, 사용자 정보 파일을 브라우저(클라이언트)가 아닌 서버 측에서 관리한다.
- 서버에서는 클라이언트를 구분하기 위해 세션 ID를 부여하며 브라우저를 종료할 때 까지 인증상태를 유지한다.
- 클라이언트가 Request를 보내면, 서버는 클라이언트에게 유일한 세션 ID를 부여한다.
- 사용자에 대한 정보를 서버에 두기 때문에 쿠키보다 보안에 좋지만, 사용자가 많아질수록 서버 메모리를 많이 차지한다는 단점이 있다.
- 즉, 동시접속자 수가 많은 웹 사이트인 경우 서버에 과부하가 발생해 성능 저하의 요인이 될 수 있다.
세션 동작 방식
- 클라이언트가 서버에 접속 시 세션 ID를 발급 받음
- 클라이언트는 세션 ID에 대해 쿠키를 사용해 저장하고 가지고 있음
- 클라이언트는 서버에 요청할 때, 쿠키에 저장된 세션 ID를 포함해 전달
- 서버는 전달받은 세션 ID를 통해 세션에 있는 클라이언트 정보를 가져와 사용
- 클라이언트 정보를 가지고 서버 요청을 처리해 클라이언트에게 응답
세션 사용 예시
- 로그인 같이 보안상 중요한 작업에 사용
쿠키와 세션의 차이
쿠키와 세션은 비슷한 역할을 하고, 동작원리도 비슷하다. 그 이유는 세션도 결국 쿠키를 사용하기 때문이다.
쿠키와 세션의 차이를 정리하자면 다음과 같다.
쿠키 (Cookie) | 세션 (Session) | |
저장 위치 | 클라이언트(브라우저) | 웹 서버 |
저장 형식 | Text | Object |
만료 시점 | 쿠키 저장시 설정 (브라우저가 종료되도, 만료시점이 지나지 않으면 자동 삭제되지 않음) |
브라우저 종료시 삭제 (기간 지정이 가능하지만, 브라우저가 종료되면 만료시간에 상관없이 자동 삭제) |
사용하는 자원(리소스) | 클라이언트 리소스 | 웹 서버 리소스 |
용량 제한 | 총 300개 하나의 도메인 당 20개 하나의 쿠키당 4KB(=4096byte) |
서버가 허용하는 한 용량제한 없음 |
속도 | 빠름 | 느림 |
보안 | 안좋음 | 좋음 |
세션이 좋은데 쿠키를 사용하는 이유
세션이 쿠키에 비해 보안도 높은 편이나 쿠키를 사용하는 이유는 세션은 서버에 저장되고, 서버 자원을 사용하기 때문에 사용자가 많을 경우 소모되는 자원이 상당하다.
이러한 자원관리 차원에서 쿠키와 세션을 적절한 요소 및 기능에 병행 사용하면, 서버 자원의 낭비를 방지하며 웹사이트의 속도를 높일 수 있다.
캐시 (Cache)
캐시란?
캐시(Cache)는 데이터나 값을 미리 복사해 임시로 저장해두는 장소를 말한다.
사이트를 불러올 때 이전에 불러왔던 사진, css, js 등을 접속할 때마다 새로 불러오게 된다면 데이터 낭비가 발생할 것이다.
이를 위해 미리 클라이언트에 캐시로 저장해두고 다시 접속했을 때 서버가 아닌 사용자의 PC에서 가져와 용량을 아끼는 것이다.
쿠키 세션 그리고 캐시?
- 캐시는 웹 페이지 요소를 저장하기 위한 임시 저장소이고, 쿠키/세션은 사용자 정보를 저장하기 위해 사용된다.
- 캐시는 웹 페이지를 빠르게 렌더링 할 수 있도록 도와주고, 쿠키/세션은 사용자의 인증을 도와준다.
이상 쿠키와 세션에 대해 간단하게 정리해보았다.
세션은 사용자 수만큼 서버 메모리를 차지하기 때문에, 최근에는 이런 문제들을 보완한 토큰 기반의 인증방식을 사용하는 추세이다.
그중 JWT(JSON Web Token)라는 것이 있는데, 다음번엔 JWT에 대해 정리해보도록 하겠다. 😄
Reference
'🕹️ Programming > 개발상식' 카테고리의 다른 글
[디자인패턴] MVC 패턴 (0) | 2023.11.03 |
---|---|
MVC를 지키면서 코딩하는 방법 (0) | 2022.11.15 |
JWT (Json Web Token) (5) | 2022.08.24 |
Authentication & Authorization (0) | 2022.04.04 |