HTTP 프로토콜은 Connectionless 하고 Stateless 하기 때문에 이전 데이터를 유지하지 않는다. 이러한 약점을 보완하기 위해 데이터 유지가 필요한 경우 쿠키와 세션을 사용한다.
HTTP의 일종으로 사용자가 어떠한 웹사이트에 접근했을 때, 그 사이트가 사용하고 있는 서버에서 사용자의 컴퓨터에 저장하는 작은 기록 정보 파일이다.
HTTP에서 클라이언트의 상태 정보를 클라이언트 PC 에 저장하였다가 필요시 정보를 참조하거나 재사용할 수 있다.
Key-Value쌍으로 구성되어 있는 데이터 파일이다.
쿠키이름, 쿠키값, 만료시간(설정), 전송할 도메인명, 전송할 경로로 구성되어 있다.
도메인 당 20개의 쿠키를 가질 수 있다.
하나의 쿠키는 4KB(= 4096 byte)까지 저장이 가능하다.
장점 | 단점 |
---|---|
사용자의 상태 정보를 유지할 수 있음 | 서버 측에서 세션을 관리해야 함 |
로그인 상태 유지 및 인증에 용이함 | 사용자가 브라우저를 닫으면 세션이 종료됨 |
세션 ID를 이용하여 사용자를 추적할 수 있음 | 사용자가 많아지면 서버에 부하가 발생할 수 있음 |
보안성이 쿠키보다 높음 | 사용자의 브라우저가 쿠키를 지원해야 함 |
사용자가 웹 서버에 접속하여 브라우저를 종료할 때까지 유지되는 상태
즉, 브라우저가 종료되기 전까지 클라이언트의 요청을 유지하게 해주는 기술을 세션이라고 한다.
웹 서버에 웹 컨테이너의 상태를 유지하기 위한 정보를 저장한다.
웹 서버에 저장되는 쿠키(세션 쿠키 / session cookie)이다.
일반적으로 만료시간를 설정하고 브라우저 메모리에만 저장되며, 브라우저 종료 시 쿠키를 자동 삭제
브라우저를 닫거나, 서버에서 세션을 삭제했을 때만 삭제가 되기 때문에 쿠키보다 비교적 보안적으로 우수하다.
서버 용량 허용 범위 내에서 저장 데이터에 제한이 없다.
각 클라이언트에 고유 세션 ID(Session ID)를 부여한다. 세션 ID를 통해 클라이언트를 구분하여 각 요구에 맞는 서비스를 제공한다.
장점 | 단점 |
---|---|
사용자의 상태 정보를 유지할 수 있음 | 서버 측에서 세션을 관리해야 함 |
로그인 상태 유지 및 인증에 용이함 | 사용자가 브라우저를 닫으면 세션이 종료됨 |
세션 ID를 이용하여 사용자를 추적할 수 있음 | 사용자가 많아지면 서버에 부하가 발생할 수 있음 |
보안성이 쿠키보다 높음 | 사용자의 브라우저가 쿠키를 지원해야 함 |
Cookie | Session | |
---|---|---|
저장 위치 | Client | Server |
저장 형식 | Text | Object |
만료 시점 | 쿠키 저장 시 설정(설정 없으면 브라우저 종료 시) | 정확한 시점 모름(브라우저 종료시 삭제됨) |
리소스 | 클라이언트의 리소스 | 서버의 리소스 |
용량 제한 | 한 도메인 당 20개, 한 쿠키 당 4KB | 제한 없음 |
속도 | 쿠키에 정보가 있어 비교적 빠름(바로 참조할 수 있어서 빠르다.) | 정보가 서버에 있어 비교적 느림(DB를 조회해야하기 때문에 네트워크 타임이 추가로 든다.) |
refresh token 을 저장하게 되면 세션 사용과 비슷해져서 jwt 장점이 사라지게 되는데 그럼에도 jwt 를 사용해야하는 이유
JWT | Session | |
---|---|---|
확장성 | 서버에 사용자 상태 정보를 저장하지 않고 사용자 id, refresh token 값과 만료 시간 등을 저장하기 때문에 확장성이 뛰어나다. | 서버에 세션 상태 정보, 사용자 id, 사용자 지정 데이터(장바구니, 찜목록) 등 사용자 정보를 저장하기 때문에 확장성이 떨어진다. |
성능 | 클라이언트가 토큰을 저장하고 사용하기 때문에 성능 저하가 발생하지 않는다. | 서버에서 관리하고 매번 서버와 클라이언트 사이에 통신해야하기 때문에 성능이 저하될 수 있다. |
단순성 | 구현 및 관리가 비교적 간단하다. | 구현 및 관리가 복잡할 수 있다. |
다양한 환경 지원 | 웹 애플리케이션, 모바일 애플리케이션, API 등 다양한 환경에서 사용 가능하다. | 웹 애플리케이션에서만 사용 가능하다. |
쿠키 사용 | 쿠키를 사용하지 않는다. | 쿠키에 저장한다. |
session = {
"user_id": 123,
"username": "semyeong",
"email": "semyeong@example.com",
"last_login": "2023-11-14T12:34:56.789Z",
"cart": {
"item_1": {
"id": 1,
"name": "Product 1",
"quantity": 2,
"price": 1000
},
"item_2": {
"id": 2,
"name": "Product 2",
"quantity": 1,
"price": 2000
}
}
}
username=johndoe; expires=Thu, 06 Mar 2024 12:34:56 GMT; path=/; domain=example.com
쿠키 | 세션 | |
---|---|---|
만료 시점 | - 만료 시간 설정 가능 (만료시간은 어디서 설정하는지, 만료시키는 주체가 무엇인지) - 만료 시간 설정하지 않으면 브라우저를 종료할 때 쿠키 삭제 - 만료 시간을 설정하면 해당 시간이 지난 후 쿠키 삭제 | - 서버 설정에 따라 만료 시점이 달라짐 - 일반적으로 사용자가 활동하지 않을 때 서버에서 설정한 세션 타임아웃에 따라 결정됨 - 그 외에도 브라우저 종료(브라우저 세션인지? api 날려서 만료시키는 것인지), 로그아웃, 세션 무효화 같은 경우에 세션 만료 |
reference
쿠키(Cookie), 세션(Session) 특징 및 차이