Blog

[CS]26 쿠키, 세션의 개념과 차이를 설명해보세요

Author
Summary
쿠키와 세션?
Category
Study
Tags
CS
Favorite
Memory Date
2023/10/23
Cross Reference Study
Related Media
Related Thought
Related Lessons
tag
날짜
작성자
진행상황
진행 전
태그구분
6 more properties
쿠키, 세션의 개념과 차이를 설명해보세요
HTTP 프로토콜의 특성이자 약점을 보완하기 위해서 쿠키 또는 세션을 사용합니다.
기본적으로 HTTP 프로토콜 환경은 "비연결성connectionless, 무상태stateless"한 특성을 가지기 때문에 서버는 클라이언트가 누구인지 매번 확인해야합니다. 이러한 HTTP특성을 보완하기 위해서 쿠키와 세션을 사용하게됩니다.
쿠키는 사용자가 어떠한 웹 사이트를 방문할 경우, 그 사이트가 사용하고 있는 서버에서 사용자의 컴퓨터에 저장하는 작은 기록 정보 파일입니다. HTTP에서 클라이언트의 상태 정보를 클라이언트의 PC에 저장하였다가 필요시 정보를 참조하거나 재사용하게 됩니다.
세션은 일정 시간동안 같은 사용자(브라우저)로부터 들어오는 일련의 요구를 하나의 상태로 보고, 그 상태를 일정하게 유지시키는 기술입니다. 방문자가 웹 서버에 접속해 있는 상태를 하나의 단위로 보고 그것을 세션이라고 합니다.
쿠키는 클라이언트측에 저장되며 텍스트형식, 쿠키 저장시 만료시간이 설정되며, 클라이언트 리소스를 사용합니다. 용량제한이있고 세션보다 속도가 빠르지만 보안상 탈취, 변형 등 취약한 문제가 있습니다.
세션은 웹서버에 저장되며, 객체형식, 브라우저 종료시 삭제되며, 기간을 지정할 수도 있습니다. 웹서버 리소스를 사용하고 용량제한은 서버 허용에따라 변경됩니다. 속도는 쿠키보다 느리지만 쿠키보다 보안상 유리합니다.
추가질문 : 비연결성과 무상태는 무엇인가요?
Connectionless(비연결성)은 HTTP는 TCP 연결을 맺고 요청(Request)을 보내면 서버는 응답(Response)을 보내고 연결이 끊어지는 것 입니다. HTTP는 인터넷 상에서 불특정 다수의 통신 환경을 기반으로 설계되었습니다. 연결을 유지하기 위한 리소스를 줄이면 더 많은 연결을 할 수 있으므로 비연결적인 특징을 갖도록 설계되었습니다.
다만 서버는 클라이언트를 기억하고 있지 않으므로 동일한 클라이언트의 모든 요청에 대해, 매번 새로운 연결을 시도/해제의 과정을 거쳐야하므로 연결/해제에 대한 오버헤드가 발생한다는 단점이 있습니다.
*이에 대한 해결책으로 오버헤드를 줄이기 위해 HTTP의 KeepAlive 속성을 사용할 수 있습니다.
KeepAlive는 지정된 시간동안 서버와 클라이언트 사이에서 패킷 교환이 없을 경우, 상대방의 안부를 묻기위해 패킷을 주기적으로 보내는것을 말합니다. 이 때 패킷에 반응이 없으면 접속을 끊게 됩니다.
Stateless(무상태)는 서버가 비연결성 때문에 클라이언트를 식별할 수가 없는 상태를 말합니다. 따라서 매번 새로운 인증을 해야합니다. HTTP의 특성 때문에 필요한 것이 쿠키와 세션입니다.
추가질문 : 각 작동 방식은 어떻게 되나요?
쿠키의 동작 방식은
클라이언트가 페이지를 요청
서버에서 쿠키를 생성
HTTP 헤더에 쿠키를 포함 시켜 응답
브라우저가 종료되어도 쿠키 만료 기간이 있다면 클라이언트에서 보관하고 있음
같은 요청을 할 경우 HTTP 헤더에 쿠키를 함께 보냄
서버에서 쿠키를 읽어 이전 상태 정보를 변경 할 필요가 있을 때 쿠키를 업데이트 하여 변경된 쿠키를 HTTP 헤더에 포함시켜 응답
예시) 방문 사이트에서 로그인 시, 아이디와 비밀번호를 저장, 쇼핑몰의 장바구니 기능
세션의 동작 방식은
클라이언트가 서버에 첫번째 요청을 보내면 서버에서 세션 객체를 생성
클라이언트에 세션 정보를 쿠키를 통해 전달
클라이언트는 세션 ID에 대한 정보를 쿠키를 사용해서 저장하고 가지고 있음
이후 클라리언트는 서버에 요청할 때, 쿠키의 세션 ID를 같이 서버에 전달해서 요청
서버는 쿠키에 저장된 세션 ID를 전달 받아서 같은 세션ID의 세션객체에 접근하여 클라언트 정보를 사용
클라이언트 정보를 가지고 서버 요청을 처리하여 클라이언트에게 응답