쿠키(Cookie)와 세션(Session)은 웹 개발에서 사용되는 데이터 저장 기술이다.
주로 웹 사이트 내에서 지속적으로 필요한 데이터를 저장하기 위해서 사용된다.
🧐 왜 이러한 지속적으로 필요한 데이터를 저장해야 할까?
이는 HTTP 프로토콜의 특성 및 약점 때문이다.
HTTP는 무상태(Stateless) 프로토콜로써 클라이언트가 요청을 한 후 응답을 받으면 즉시, 해당 연결을 끊어 버리는(connectionless)특징이 있다.
이 때, 통신이 끝나면(요청을 한 후 요청을 받으면) 이전 상태 정보를 유지하지 않는다.
😧 그럼 이것이 왜 문제가 될까?
쉽게 쿠팡을 예시로 생각해보자.
첫째로 쿠팡에서 로그인을 하고, 다른 웹 페이지로 이동할 때마다 로그인된 정보가 사라져 버리므로 계속해서 다시 로그인해야한다.
둘째로 내 장바구니에 담아 둔 물건이 다른 물건을 쇼핑하기 위해 다른 물건 페이지로 들어갔다 오면, 장바구니가 다시 비워져 버린다.
이는 무상태. 즉, 상태정보를 저장하지 않기 때문이다.
이러한 지속적으로 필요한 상태 정보를 저장하기 위한 방법이 바로 쿠키와 세션이다.
쿠키는 클라이언트
에 상태 정보를 저장하고 유지한다.
쿠키를 사용하여 클라이언트
에 식별자를 저장하고 로그인 상태를 유지할 수 있다. 이로써 무상태 프로토콜의 약점을 보완할 수 있다.
수명: 쿠키는 설정된 만료 날짜까지 유지된다.
일시적인 쿠키도 생성할 수 있으며, 브라우저를 닫으면 삭제되는 세션 쿠키도 사용할 수 있다.
보안: 쿠키는 클라이언트 측에 저장되므로 보안상 취약할 수 있다.
세션은 서버
에 상태 정보를 저장하고 유지한다.
세션을 사용하여 서버에 사용자 정보를 저장하고 중요한 데이터를 서버에 보관함으로써 데이터 유출을 방지하고, 무상태 프로토콜의 약점을 보완 할 수 있다.
저장 위치: 세션은 서버 측에 정보를 저장한다. 클라이언트는 세션 식별자(일반적으로 세션 쿠키)를 사용하여 서버와 통신한다.
수명: 세션 데이터는 사용자의 세션이 종료되거나 일정 시간 동안 유효하다. 세션이 종료되면 데이터도 삭제된다.
보안: 세션 데이터는 서버 측에서 안전하게 관리되므로 상대적으로 안전하다.
사용자 설정: 사용자의 웹 사이트 설정, 예를 들어 언어, 테마 또는 폰트 크기.
인증 정보: 사용자 로그인 정보를 저장하여 로그인 상태를 유지하고 세션이 만료되어도 다시 로그인할 필요가 없도록 한다.
프로필 식별자: 사용자를 고유하게 식별하기 위한 고유한 식별자.
🍪 쿠키 사용 예시
- 웹사이트에서 로그인 시, "아이디와 비밀번호를 저장하시겠습니까?" 문구
- 웹의 방문 팝업에서 "오늘 더 이상 이 창을 보지 않음" 체크
이러한 사용자의 로그인 정보 및 사용자 설정을 사용자 인증 지정 시간 동안 클라이언트에 데이터를 저장해둔다.
사용자 세션 데이터: 그인된 사용자의 사용자 이름, 이메일 주소, 프로필 정보
인증 토큰: 사용자 세션을 인증하는 데 사용되는 토큰,
(ex. JSON Web Token (JWT) 토큰)
세션 상태 정보: 사용자 활동 상태 정보, 예를 들어 현재 페이지, 로그인 상태, 사용자 권한.
임시 데이터: 사용자가 웹 애플리케이션을 통해 일시적으로 저장하는 데이터
(ex. 웹 폼 데이터, 검색 결과)
🔮세션 사용 예시
- 웹 사이트에서 사용자 로그인 정보의 저장
(세션 시간이 만료되면 자동으로 로그아웃 된다)
쿠팡에서 장바구니에 여러 살 물건들을 추가하는 경우를 통해 생각해보자.
사용자는 쿠팡 사이트에 방문하여 원하는 상품을 선택한 후, 장바구니에 담기 버튼을 클릭한다.
클라이언트(사용자의 브라우저)
는 서버
에 장바구니에 담긴 상품 정보를 전송한다.
서버
는 이 정보를 받아 쿠키에 사용자의 장바구니에 상품을 정보를 추가한다.
(실제로 데이터 베이스에 저장되는 것이 아니라, 쿠키에 저장되는 것!)
서버
는 응답으로 해당 쿠키를 클라이언트
로 보낸다.
클라이언트(사용자 브라우저)
는 이 쿠키를 받아서 저장하고, 이후에 해당 웹 사이트를 다시 방문할 때 이 쿠키를 함께 보내 사용자의 장바구니를 복원하는 데 사용한다.
서버
는 세션을 생성하고 해당 세션에 고유한 세션 ID를 할당한다.서버
에 저장된다.서버
는 세션 ID를 클라이언트
에게 전달한다.
일반적으로 쿠키를 통해 클라이언트
에게 세션 ID를 전달하고, 이를 쿠키에 저장한다.
클라이언트
가 서버에 요청(웹 페이지를 이동)할 때마다, 해당 브라우저는 저장된 세션 ID를 요청의 헤더에 포함시켜 보낸다.
서버
는 클라이언트
의 요청의 헤더에서 세션 ID를 확인하고, 사용자의 로그인을 허용한다.
서버
에서 세션이 만료되면, 클라이언트
에게 부여된 해당 세션ID는 서버 측에서 삭제된다.
세션이 만료되었으므로 클라이언트에서는 다시 로그인 해야한다.