공부해봅시당
[쉽게 배우자! WEB] 쿠키&세션 VS 토큰(1) 본문
쿠키와 세션, 토큰은 기본적이면서 반드시 알아야 하는 개념이다.
하지만, 이 개념에 대해 알고 있다고 착각하고 제대로 이해하지 못하는 경우가 많다.
따라서 쿠키와 세션, 토큰에 대해 정리해보는 시간을 가져보려고 한다.
Cookie와 Session

처음 방문한 웹사이트에서 우리는 쿠키 사용에 동의해 달라는 메시지를 받아본 적이 있을 것이다.
처음에는 해킹 당할까봐 무서워서 쿠키 사용에 동의하지 않았지만, 이제는 익숙하게 Accept all cookies를 클릭하고 웹사이트를 사용하곤 한다.
이러한 쿠키는 도대체 어떤 이유로 쿠키라는 이름을 갖게 된 것일까?
HTTP Cookie의 유래
쿠키의 유래를 살펴보면 아래와 같다.
유닉스 운영체제에서 두 프로그램 사이에 전송되는 작은 데이터 패킷을 매직 쿠키라 불렀는데, 여기서 HTTP 쿠키가 유래되었다. HTTP 쿠키를 만든 루 몬텔루 라는 웹 브라우저 개발자가 사용자들의 방문 기록을 남기기 위해 매직 쿠키에서 개념을 차용해서 사용한 것이다.
(출처 : http://answers.google.com/answers/threadview/id/534555.html)
위에 언급된 이야기들은 아마 매직쿠키의 유래인 듯 하다.
웹사이트 방문 시 만들어지는 쿠키는 동화 헨젤과 그레텔에서 유래했다는 설이 있다.
헨젤과 그레텔을 떠올려 보자.
어린 시절 우리가 읽었던 헨절과 그레텔이라는 동화에서는 과자로 만든 집이 등장한다.
동화 속에서 헨절과 그레텔은 숲에서 길을 잃지 않기 위해 빵, 과자, 쿠키 부스러기를 흘려 걸어온 길을 표시한다.

헨젤과 그레텔이 걸어온 길을 추적하기 위해 쿠키를 사용했던 것처럼 웹 서비스에서는 로그인, 검색기록 등 우리가 웹사이트에서 어떤 일을 했는지 쿠키에 저장한다는 것이다.
또 다른 이야기로는 '쿠키 안에 운세 같은 메세지가 담겨있는 포춘쿠키와 유사하다고 해서 쿠키가 되었다'라는 이야기도 있다.
HTTP Cookie가 필요한 이유
HTTP 쿠키(아래에서는 쿠키라고 줄여서 부르도록 하겠다)는 웹 쿠키, 브라우저 쿠키로도 불리는데 서버가 사용자의 웹 브라우저에 전송하는 작은 데이터 조각을 의미한다. 위에서 언급했듯이 유닉스의 매직쿠키에서 이름과 개념이 유래하였고, 루 몬텔루라는 웹 브라우저 개발자가 웹 사이트에 접속한 클라이언트를 확인하기 위해 만들었다.
필요한 이유는 HTTP의 특징 때문이다.
HTTP는 웹에서 이루어지는 모든 데이터 전송의 기본이 되는 프로토콜이다.
HTTP 프로토콜은 connectionless(비연결성)와 stateless(비상태성)라는 특징을 가진다.
- connectionless
- 의미 : 모든 사용자의 요청마다 연결과 해제의 과정을 거침
- 장점 : 모든 요청 간 의존 관계가 없음. 즉, 독립적임 > 이전 요청이 다음 요청에 영향을 주지 않기 때문에 이전 요청에서 에러가 발생하더라도 다음 요청을 새롭게 인지하여 다음 요청 처리 시 에러가 발생하지 않을 수 있음
- 단점 : 현재 접속한 사용자가 이전에 접속했던 사용자와 같은 사용자인지 서버 입장에서 알 방법이 없음
- stateless
- 의미 : 사용자의 상태 정보를 저장하지 않음
- 장점 : 서버의 자원을 크게 절약할 수 있음
- 단점 : 사용자의 상태를 알 수 없음 > 사용자가 로그인한 상태인지 아닌지 알 수 없게 됨
이러한 특징 덕분에 서버는 확장성이 높아지지만, 다음과 같은 문제들이 발생한다.
한 사람이 웹사이트를 사용하기 위해 서버에 보내는 모든 요청은 연결성이 없어서 항상 다른 사용자로 인식된다.
그리고 우리가 웹사이트에서 로그인하고 서버에 다른 요청을 보낸다면 서버는 현재 사용자가 로그인한 상태인지 아닌지 알 수가 없다.
놀이공원을 예로 들어보자.
놀이공원(서버)은 입장(요청)했다가 퇴장(응답)하는 손님들을 한명 한명 다 기억할 수가 없다.
그렇기 떄문에 놀이공원에서는 재입장하는 손님을 구분하기 위해 팔찌같은 입장권을 준다.
마찬가지로 서버에서도 이미 요청을 했었던 클라이언트인지 매번 확인하기 어렵기 때문에 입장권처럼 쿠키를 주는 것이다.
따라서 서버는 브라우저에 사용자의 정보를 저장하기로 한다.
브라우저에 저장된 쿠키는 웹사이트 재방문 시 효율적으로 서비스를 제공하기 위해 사용하며, 서비스 개선을 위한 통계자료로 활용하고, 광고에도 사용한다.
브라우저는 사용자의 컴퓨터에 설치된 소프트웨어이므로 쿠키는 사용자가 가지고 있는 정보라고 할 수 있다.
사용자는 브라우저의 설정 화면이나 개발자 도구에서 쿠키를 확인하고 수정, 삭제할 수 있다.
Cookie의 구성요소
따라서 Cookie가 등장하였고, Cookie는 아래의 구성요소를 가진다.
- 쿠키의 이름 (name)
- 쿠키의 값 (value)
- 쿠키의 만료시간 (Expires)
- 쿠키를 전송할 도메인 이름 (Domain)
- 쿠키를 전송할 경로 (Path)
- 보안 연결 여부 (Secure)
- HttpOnly 여부 (HttpOnly)

Cookie의 특징
- 쿠키는 한개에 4KB 까지 저장 가능하며, 최대 300개 까지 저장할 수 있는 텍스트 파일이다.
- 쿠키는 클라이언트에 저장된다.
- 쿠키에는 이름, 값, 만료날짜, 경로 정보가 들어있다.
- 기본적으로 쿠키는 웹 브라우저가 종료되면 삭제된다. ( 만료날짜를 지정해 주면 만료일이 되어야 삭제된다.)
- 웹 브라우저에 해당 서버의 쿠키 정보가 있으면 HTTP 요청 (HTTP 헤더의 Cookie)에 무조건 담아 보낸다.
Cookie의 문제점
쿠키는 당사자 뿐만 아니라 제 3자가 조회하는 것도 가능하다.
- 쿠키 값을 임의로 변경할 수 있음
- 쿠키에 보관된 정보를 타인이 훔쳐갈 수 있음
- 한 번 도용된 쿠키정보는 계속 악용될 수 있음
따라서 개인 정보를 담은 내용이나 보안상 민감한 정보를 저장하는 데이는 적합하지 않다.
그렇기 때문에 남에게 탈취되거나 사용자에 의해 조작되어도 크게 문제되지 않을 정보를 브라우저에 저장함으로써 웹사이트 이용을 편리하게 해주는 것에 주로 쓰인다.
예를 들어 자주 보는 웹툰 목록이나 웹 페이지의 다크 모드 설정, 한국어 언어 설정 등과 같은 간단한 정보를 저장한다.
따라서 쿠키에는 사용자에게 맡겨도 되는 정보만 저장한다.
HTTP Session의 등장
Cookie의 문제점을 정리해보면 결국 '중요한 개인정보들이 클라이언트에 저장되어 있기 때문에 위변조 및 도용이 쉽다'는 것이다.
그럼 이런 중요 정보들을 클라이언트가 아니라 서버에서 관리하도록 하고, 그게 외부로 노출되지 않도록 하면 되지 않을까?
그래서 클라이언트는 서버가 보관하고 있는 중요 정보에 접근할 수 있는 키만 가지고 있고, 이 키 또한 유효시간을 짧게 둬서 갱신되도록 하면 보안적으로 많이 안전해질 것이다.
이렇게 중요한 정보를 보관 및 연결 유지 방법을 HTTP 세션이라 한다.
HTTP Session
세션이란 통신을 하기 위해 서로 연결된 순간부터 통신을 마칠 때 까지의 기간을 의미한다.
단순히 세션의 뜻을 찾아보아도 시간, 시즌 이라고 나온다.
HTTP 세션이란 클라이이언트가 웹서버에 연결된 순간부터 웹 브라우저를 닫아 서버와의 HTTP 통신을 끝낼 때 까지의 기간이다.
하지만 보통 HTTP 세션(아래에서는 세션이라고 줄여서 부르도록 하겠다)이라고 말할 때에는 서버에 세션에 대한 정보(세션 상태, 클라이언트 상태, 세션 데이터 등)를 저장해 놓고, 세션 쿠키( 고유한 세션 ID 값 )를 클라이언트에게 주어 서버가 클라이언트를 식별할 수 있도록 하는 방식자체를 의미하는 경우가 많다.
Session의 특징
- 따로 용량의 제한이 없다. ( 서버의 능력에 따라 다를 수 있다. )
- 서버에 세션 객체를 생성하며 각 클라이언트 마다 고유한 세션 ID 값을 부여한다.
- 쿠키를 사용하여 세션 ID 값을 클라이언트에 보낸다.
- 웹 브라우저가 종료되면 세션 쿠키는 삭제된다.
그렇다면 쿠키와 세션은 다른 개념일까?
Cookie와 Session의 관계
흔히 쿠키와 세션을 비교할 때 쿠키는 클라이언트(웹 브라우저)에 정보를 저장하는 것이고, 세션은 서버에 정보를 저장하는 것이다 라고 비교한다. 맞는 말이지만 마치 서로 반대되는 개념처럼 오해할 수 있는데, 결국 세션은 쿠키를 이용하는 하나의 방식일 뿐이다. ( 쿠키와 세션은 방식의 차이일 뿐 반대 개념이 아니다. )
쿠키는 stateless 한 HTTP 통신에서 클라이언트에게 정보(표시)를 주어 해당 클라이언트를 식별하기 위해 만들어졌다.
클라이언트가 식별이 가능해야 서버는 특정 클라이언트와 계속해서 통신을 하고 있는지 확인이 가능하기 때문이다.
하지만 클라이언트에 저장된다는 쿠키의 특징은 보안에 있어서는 치명적인 단점이다.
예를들어 로그인을 위해 사용자가 입력한 아이디와 비밀번호를 쿠키에 담아 클라이언트에 저장한 뒤 서버에서는 쿠키로 해당 사용자가 로그인한 사용자인지 확인한다고 생각해보자. 그러면 누군가 마음만 먹으면 쿠키를 확인해 클라이언트에 저장된 아이디와 비밀번호를 볼 수 있다.
그래서 세션이라는 개념을 통해 중요한 정보는 서버에서 관리하고 클라이언트에게는 세션 쿠키( 세션 ID )를 주어 식별이 가능하도록 한 것이다.
결론적으로 사전적 정의로 보면 세션(통신을 시작하고 마칠 때 까지의 기간)을 유지하기 위해 쿠키를 사용하는 것인데, 용어 상으로는 세션이란 서버에 정보를 저장하고 세션 쿠키를 통해 클라이언트를 식별하는 방식을 통틀어 말하는 것으로 보면 되겠다.
따라서 쿠키와 세션도 결국 목적(클라이언트에서 관리하느냐, 서버에서 관리하느냐)에 맞게 사용하면 된다.
(클라이언트는 믿을 수 없다. 중요한 정보나 처리는 서버에서 다뤄야한다! 만 명심하자.)
예를들어 쿠키는 쇼핑몰의 장바구니, 개인 설정(팝업창 표시여부 등) 같은 것들에 많이 사용되고 세션은 로그인 유지 등에 많이 사용된다.
참고자료
https://www.youtube.com/watch?v=JRXs0gZISwI
https://itstory1592.tistory.com/62
쿠키(Cookie)와 세션(Session)을 이용한 로그인
쿠키(Cookie)와 세션(Session) 동아리 프로젝트 기획 단계에서 '로그인 기능을 어떠한 방식으로 구현하는 것이 효율적일까?' 라는 생각을 하게 되어, OAuth, JWT 등 여러 방법들 중에서도 쿠키와 세션을
itstory1592.tistory.com
완벽 정리! 쿠키, 세션, 토큰, 캐시 그리고 CDN
웹 서핑을 하면서 어떤 사이트에 들어가면 쿠키를 설정하라는 문구를 본 적이 있을 거예요. 이 쿠키 때문에 쇼핑 사이트에 로그인하지 않아도 장바구니에 물건을 담아두거나 검색 기록에서 이
hongong.hanbit.co.kr
https://lgphone.tistory.com/65
Web - 쿠키와 세션 (Cookie and Session)
클라이언트에서 보내는 요청에는 큰 단점이 존재한다. 바로 누가 요청을 보내는지 모른다는 것이다. 물론 요청을 보내는 IP 주소나 브라우저의 정보를 받아올 수는 있다. 그러나 여러 컴퓨터가
lgphone.tistory.com
https://catsbi.oopy.io/0c27061c-204c-4fbf-acfd-418bdc855fd8
6. 로그인 처리 1 - 쿠키, 세션
목차
catsbi.oopy.io
https://noahlogs.tistory.com/38
[네트워크] HTTP 쿠키와 세션이란 ?
HTTP 에는 쿠키라는 개념이 존재하는데, 이름부터가 친숙하고 귀엽다. 왜 쿠키라는 이름이 붙여졌을까에는 여러가지 이야기들이 있는데, 내가 처음 공부할 때 들었던 이야기는 헨젤과 그레텔 동
noahlogs.tistory.com
'STUDY > 네트워크' 카테고리의 다른 글
[네트워크] 네트워크 프로토콜 표준화(IETF, IEEE) (0) | 2023.06.14 |
---|---|
[네트워크] 네트워크 성능 분석 명령어(ping, netstat, nslookup 등) (0) | 2023.06.14 |
[네트워크] 네트워크 분류(LAN & MAN & WAN) (0) | 2023.06.13 |
[네트워크] 네트워크 토폴로지와 병목 현상 (4) | 2023.06.13 |
[네트워크] 처리량과 지연 시간 (0) | 2023.06.13 |