[CS] 7. 쿠키와 세션

사전 지식

더보기

HTTP는 기본적으로 비상태성인 프로토콜이다. 비상태성이라는 것은 클라이언트-서버 간의 통신에서 서버가 클라이언트의 상태를 알 수 없다는 것이다.(통신이 끝나면 상태를 유지하지 않는다는 것을 의미한다. 이러한 성질 때문에 쿠키와 세션을 이용하지 않는다면 쇼핑몰에서 페이지를 이동할 때마다 로그인을 해야 할 것이다.) 비상태성인 이유는 HTTP가 비연결지향적이라는 특성을 지니기 때문이다. 비연결지향이라는 것은 요청에 대한 응답을 마치면 서버와 클라이언트의 연결이 끊어진다는 것을 의미한다. 이 성질 때문에 서버는 요청을 받더라도 어느 클라이언트에서 요청을 받았는지 식별하지 못한다.

즉, 통신이 끝나면(요청에 대한 응답을 하게 되면) 서버와 클라이언트의 연결이 끊어지기 때문에 서버가 클라이언트의 상태를 알 수 없게 된다. 하지만 클라이언트의 상태를 서버에서 알아야 할 때가 있기 마련이고, 이러한 경우를 대비해서 생겨난 것이 쿠키, 세션

 

+)HTTP가 비상태, 비연결지향적인 이유:

HTTP는 불특정 다수와의 통신 환경을 기초로 설계되었다. 따라서 한 번 맺은 연결을 지속적으로 유지하면 자원 소모가 심하기 때문에 지속적 연결이 아닌 매번 연결을 맺는 것을 택하게 되었다.

쿠키

클라이언트 로컬에 저장되는 key-value 형태의 작은 데이터 파일이다. 쿠키는 이름(각 쿠키를 구별할 때 이용), 값(쿠키의 이름과 관련된 값), 유효시간(쿠키의 유지시간), 도메인(쿠키를 전송할 도메인), 경로(쿠키를 전송할 요청 경로)로 구성이 되어 있으며, 사용자 인증이 유효한 시간을 명시할 수 있다. 

클라이언트에서 서버에 요청할 때 쿠키를 담아 보내면, 서버에서는 쿠키에서 상태 데이터를 읽고 클라이언트의 상태를 파악하여 응답을 한다. 쿠키는 서버-클라이언트의 통신 이력이 없으면 존재하지 않기 때문에, 쿠키가 없는 상태에서 클라이언트가 서버에 요청한다면 서버에서는 쿠키를 생성하여 응답한다.(HTTP response 헤더의 'set-cookie')

그 후 클라이언트에서 쿠키 정보를 저장하고, (HTTP의 비연결성으로 인해 연결이 끊긴 상태이다) 추후 요청을 할 일이 있다면 쿠키를 업데이트하여 변경된 쿠키를 HTTP request 헤더에 포함시켜 응답한다. (쿠키는 사용자가 따로 요청하지 않더라도 브라우저의 request시 request 헤더를 넣어서 자동으로 서버에 전송한다.)  해당 요청을 받는 서버에서 담아 보낸 쿠키를 통해 이전에 요청을 보낸 클라이언트를 인식하게 되어 HTTP의 비연결지향적인 성질을 보완한다.

 

클라이언트에 300개까지 쿠키 저장이 가능하며, 1개의 도메인당 20개의 값만을 가질 수 있고, 각 쿠키값은 4kb까지 저장한다. 

쿠키는 인증을 편하게 할 수 있다는 장점이 존재하나 상태 데이터가 존재하기 때문에 변조, 악용의 가능성이 커 보안에 취약하다는 단점이 존재한다. 쿠키는 브라우저가 종료된 후에도 유지된다는 특징을 가진다.

 

쿠키는 사용자 닉네임, 접속 시간, 장바구니, 팝업창 일주일 동안 보지 않기 등 서버가 알아야 할 정보들을 저장할 때나, 사용자마다 다르게 그 사람에게 적절한 페이지를 보여줘야 하는 경우나, 사용자의 행동과 패턴을 분석하고 기록할 때 사용된다. 세션에 담는 정보에 비해 덜 민감한 정보들을 보관한다.

 

세션

세션은 서버에 상태 데이터를 저장한다. 기본적으로 쿠키를 이용하나, 쿠키에는 세션 id만을 저장하고, 상태 데이터들은 세션 id를 id로 하여 서버에 저장한다. 이때 세션 id는 클라이언트마다 고유한 값을 가진다. 세션도 쿠키와 마찬가지로 클라이언트-서버 통신 이력이 없다면 존재하지 않으며, 세션이 없는 상태에서 클라이언트가 서버에 요청을 한다면 서버에서 세션 id를 생성하고, 클라이언트는 세션 id에 대해 쿠키를 사용하여 저장하고 가지고 있다. 클라이언트가 서버에 요청을 할 일이 있다면, 서버 id를 쿠키에 담아 요청한다. (HTTP response 헤더의 'set-cookie') 서버는 세션id를 전달받고, 세션 id로 세션에 있는 클라이언트 정보를 가져와서 서버 요청을 처리하여 클라이언트에게 응답한다. (HTTP request 헤더의 'cookie')

 

세션도 쿠키를 통해서 정보를 주고 받는다. 즉,  상태 정보를 유지하는 수단은 쿠키이고,  쿠키를 이용하는 특정 방식이 세션이라고 볼 수 있다.

 

https://hazelcast.com/glossary/web-session/

 

세션은 세션 id를 제외한 상태 데이터들이 서버에 저장되기 때문에 쿠키에 비해 보안성이 높다는 특징을 가진다. (이러한 특징 때문에 쿠키에 담는 정보보다 더 민감한 정보들을 보관한다.) 그러나 서버에 상태 데이터를 저장하기 때문에 과부화의 위험성을 가지고, 세션이 많이 존재한다면 서버에 문제가 생길 가능성도 존재한다. 쿠키와 다르게 세션은 세션 id를 통해 세션을 읽어오고, 그 후 데이터를 읽어야 하기 때문에 쿠키에 비해 응답 속도가 상대적으로 느리다는 특성을 가진다. 또한 세션은 브라우저가 종료되면 기본적으로 소멸한다는 특징을 가진다.

 

더보기

쿠키/세션과 캐시의 차이

 

캐시는 이미지, css, js 파일 등을 브라우저나 서버 앞 단에 저장해놓고 사용하는 것이다. 웹 페이지를 빠르게 렌더링 할 수 있도록 도와주고, 쿠키와 세션은 사용자의 인증을 도와준다. 한 번 캐시에 저장되면 서버에서 변경이 되어도 사용자는 변경하는 것처럼 보이지 않는데,(브라우저를 참고하기 때문에 발생하는 현상) 이러한 부분은 캐시를 지워주거나 서버에서 클라이언트로 응답을 보낼 때 헤더에 캐시 만료시간을 명시하는 방법들을 이용할 수 있다.

https://interconnection.tistory.com/74

 

 

JWT(JSON Web Token)

JWT는 유저를 인증하고 식별하기 위한 토큰 기반의 인증이다. 토큰은 세션과 달리 클라이언트에 저장되기 때문에 세션의 단점인 서버에 부담을 줄 수 있다는 것을 보완할 수 있다. JWT는 토큰 자체에 사용자의 권한 정보나 서비스를 사용하기 위한 정보가 포함된다는 것이다. 데이터가 많아지면 토큰이 커질 수 있고, 토큰이 한 번 발급되면 사용자의 정보가 바뀌어도 토큰을 재발급하지 않는 이상 반영되지 않는다.

 

JWT를 이용하면 비상태성인 환경에서 사용자 데이터를 주고받을 수 있다. 세션과 다르게 토큰을 클라이언트에 저장하고 요청시 단순히 HTTP 헤더에 토큰을 첨부하기만 해도 데이터를 요청하고 응답을 받아올 수 있게 된다.

 

JWT 사용 순서

1. 클라이언트가 사용자 ID, PWD를 통해 웹 서비스 인증

2. 서버에서 서명된 JWT를 생성하여 클라이언트에게 응답으로 돌려주기

3. 클라이언트가 서버에 데이터를 추가적으로 요청할 때, HTTP 헤더에 JWT를 첨부

4. 서버에서 JWT를 검증

 

JWT는 Header, Payload, Signature 로 구성된다. Header에는 JWT에서 사용할 타입과 해시 알고리즘의 종류가 담겨있고 Payload는 서버에서 첨부한 사용자 권한 정보와 데이터가 담겨있다. Signature에는 Header와 Payload를 Base64 URL-safe encode를 한 후 Header에 첨부한 해시함수를 적용 후, 개인 키로 서명한 전자서명이 담겨있다. 여기서 만든 전자서명이 위변조를 확인하기 위해 사용하는 중요 정보이고, JWT를 신뢰 가능한 토큰으로 만든다.


Reference

https://velog.io/@damiano1027/CS-%EC%BF%A0%ED%82%A4Cookie%EC%99%80-%EC%84%B8%EC%85%98Session

 

[CS] 쿠키(Cookie)와 세션(Session)

쿠키와 세션에 대해 알아보기 전에, 생겨나게 된 배경을 알아볼 필요가 있다. HTTP는 기본적으로 Stateless(무상태)한 프로토콜이다.stateless하다는 것은 클라이언트와 서버와의 통신에서 서버는 클

velog.io

https://hec-ker.tistory.com/368

 

[CS/보안 기초] (1) 쿠키(cookie)와 세션(session)의 차이

오늘부터 가볍게 면접 준비도 할 겸 헷갈리는 개념도 바로 잡을 겸 이 글을 보는 다른 학생들에게 도움도 될 겸! CS/보안 기초 개념을 정리할까 한다. 쿠키와 세션을 이해하려면, 먼저 쿠키와 세

hec-ker.tistory.com

https://jungeun960.tistory.com/188

 

[CS] 쿠키(Cookie)와 세션(Session) 차이

▶ 쿠키와 세션을 사용하는 이유 HTTP의 비연결성(Connectionless)과 비상태성(Stateless)을 보완하여 서버가 클라이언트를 식별하기 위해 사용합니다. HTTP는 서버의 자원을 절약하기 위해 모든 사용자

jungeun960.tistory.com

https://kxmjhwn.tistory.com/315

 

CS : Network : 쿠키(cookie), 세션(session)

쿠키와 세션의 필요성 1. HTTP 프로토콜의 특징인, connectionless(비연결성)와 stateless(비상태성) 때문이다. 2. 때문에 HTTP 프로토콜은 모든 요청 간 '의존관계'가 없다. 즉, 현재 접속한 client가 이전에

kxmjhwn.tistory.com

https://velog.io/@pixelstudio/%EC%BF%A0%ED%82%A4%EB%8A%94-%EB%8C%80%EC%B6%A9-%EC%9D%B4%ED%95%B4%ED%96%88%EA%B3%A0..-%EC%84%B8%EC%85%98%EC%9D%80

 

쿠키는 대충 이해했고.. 세션(session)은?

HTTP 프로토콜은 요청을 받고 응답을 보내면 이전 정보는 기억하지 않는다. 그래서 브라우저에 쿠키를 담아 정보를 저장하는 방법을 사용했는데 이 방법으론 보안에 취약한 단점을 가지고있다.

velog.io

https://interconnection.tistory.com/74

 

쿠키와 세션 개념

노션 페이지(아래 내용과 동일) 개요 쿠키와 세션은 개발자 말고도 인터넷 사용자라면 누구나 많이 들어본 단어입니다. 하지만 개념에 대해서는 많은 사람들이 헷갈려 하기에 쉽고 간단하게 정

interconnection.tistory.com

https://pronist.dev/143

 

JWT(JSON Web Token)의 개념부터 구현까지 알아보기

JWT(JSON Web Token) JWT 는 유저를 인증하고 식별하기 위한 토큰(Token)기반 인증이다. RFC 7519 에 자세한 명세가 나와있다. 토큰은 세션과는 달리 서버가 아닌 클라이언트에 저장되기 때문에 메모리나

pronist.dev

 

'CS' 카테고리의 다른 글

[CS] 9. 트랜잭션, 쿼리문 정리  (0) 2023.03.30
[CS] 8. RDBMS, NoSQL  (0) 2023.03.21
[CS] 6. 서버, 클라이언트, WAS, DB 서버  (0) 2023.02.23
[CS] 4. 라우팅과 라우터  (0) 2023.02.14
3.스레드 동기화  (0) 2023.02.09
TAGS.

Comments