HTTP 프로토콜의 특성이자 약점을 보완하기 위해서 쿠키 또는 세션을 사용한다.
기본적으로 HTTP 프로토콜 환경은 "Connectionless", "Stateless" 한 특성을 가지기 때문에 서버는 클라이언트가 누구인지 매번 확인해야 한다. 이 특성을 보완하기 위해서 쿠키와 세션을 사용한다.
Connectionless(비연결성)
HTTP는 TCP 연결을 맺고 요청(Requset)을 보내면 서버는 응답(Response)을 보내고 연결이 끊어진다.
물론 HTTP 1.1 버전은 커넥션을 계속 유지하는 keep-alive 옵션이 Default다.
하지만 HTTP 1.0 버전은 기본적으로 Connectionless이다.HTTP가 TCP 위에서 구현되었기 때문에(TCP는 연결지향, UDP는 비연결지향) 네트워크 관점에서 keep-alive는 옵션으로 Connectionless의 연결비용을 줄이는 것을 장점으로 비연결지향이라 한다.
Stateless(무상태)
HTTP는 상태를 따로 저장하지 않는다. 즉 연결이 끊어지는 순간 모든 상태 정보가 사라지게 된다.
따라서 서버는 클라이언트가 첫 번째 통신 때 보낸 정보를 두 번째 통신 때 알 수 없다.But, 실제로는 데이터 유지가 필요한 경우가 많다.
정보가 유지되지 않으면, 매번 페이지를 이동할 때마다 로그인을 다시 하거나,
상품을 선택했는데 구매 페이지에서 선택한 상품의 정보가 없거나 하는 등의 문제가 발생할 수 있다.-> 따라서, Stateless 경우를 대처하기 위해서 쿠키와 세션을 사용한다.
서버와 클라이언트가 통신할 때 통신이 연속적으로 이어지지 않고 한 번 통신이 되면 끊어진다.
따라서 서버는 클라이언트가 누구인지 계속 인증을 해줘야 한다. 하지만 그것은 매우 귀찮고 번거로운 일이다.
또한 웹페이지의 로딩을 느리게 만드는 요인이 되기도 한다. 그러한 번거로움을 해결하는 방법이 바로 쿠키와 세션이다.
정리하면, 클라이언트와 정보 유지를 하기 위해 사용하는 것이 쿠키와 세션이다.
쿠키는 클라이언트(로컬)에 저장되는 키와 값이 들어있는 작은 데이터 파일이다. 이러한 쿠키는 클라이언트에 저장되어 필요 시 정보를 참조하거나 재사용할 수 있다.
특징
- 이름, 값, 만료일(저장 기간 설정), 경로 정보로 구성되어 있다.
- 클라이언트에 총 300개의 쿠키를 저장할 수 있다.
- 하나의 도메인 당 20개의 쿠키를 가질 수 있다.
- 하나의 쿠키는 4KB(= 4096byte)까지 저장할 수 있다.
쿠키의 동작 방식 예시
클라이언트(웹 브라우저)가 서버에 로그인을 요청한다고 하자.
서버는 클라이언트의 요청을 받고 클라이언트의 정보를 담은 쿠키를 생성한다.
이후 HTTP 헤더에 set-cookie 옵션을 통해 쿠키를 포함해 응답을 보낸다.클라이언트는 해당 쿠키를 쿠키 저장소에 저장해 놓는다.
클라이언트가 로그인을 완료하고 첫 페이지는 welcome 페이지에 접근한다고 하자.
이때 클라이언트는 쿠키 저장소에서 쿠키를 꺼내 HTTP 요청에 쿠키를 담아 전송한다.
그럼 서버는 HTTP 요청의 쿠키를 읽어 클라이언트를 식별할 수 있다.
만약 쿠키가 없었다면 다시 로그인 정보를 보내야 하는 불상사가 일어났을 것이다.
세션은 일정 기간 동안 같은 사용자(클라이언트)로부터 들어오는 일련의 요구를 하나의 상태로 보고 그 상태를 일정하게 유지하는 기술이다.
여기서 일정 기간은 방문자가 웹 브라우저를 통해 웹 서버에 접속한 시점으로부터 웹 브라우저를 종료하여 연결을 끝내는 시점을 말한다.
즉, 방문자가 웹 서버에 접속해 있는 산태를 하나의 단위를 세션이라고 한다.
세션은 쿠키를 기반으로 하지만 쿠키와 다르게 서버 측에서 저장하고 관리한다.
서버는 세션 ID를 이용해 클라이언트를 구분하며, 웹 브라우저가 서버에 접속해 브라우저를 종료할 때까지 세션을 유지한다.
특징
- 웹 서버에 웹 컨테이너의 상태를 유지하기 위한 정보를 저장한다.
- 웹 서버의 저장되는 쿠키(= 세션 쿠키)
- 브라우저를 닫거나, 서버에서 세션을 삭제했을 때만 삭제가 되므로, 쿠키보다 비교적 보안이 좋다.
- 저장 데이터에 제한이 없다.(서버 용량이 허용하는 범위)
- 각 클라이언트마다 고유한 세션 ID를 부여한다.
세션 ID로 클라이언트를 구분하여 각 클라이언트 요구에 맞는 서비스를 제공한다.
세션의 동작 방식 예시
클라이언트(웹 브라우저)가 서버에 로그인을 요청한다고 하자.
서버는 클라이언트의 요청을 받고 클라이언트의 정보를 담은 세션을 생성한다.
이후 세션 ID를 담은 쿠키를 생성하고, HTTP 헤더에 set-cookie 옵션을 통해 쿠키를 포함한 응답을 보낸다.클라이언트는 해당 쿠키를 저장소에 저장해 놓는다.
클라이언트가 로그인을 완료하고 첫 페이지인 welcome 페이지에 접근한다고 하자.
이때 클라이언트는 쿠키 저장소에서 쿠키를 꺼내 HTTP 요청에 쿠키를 담아 전송한다.
그럼 서버는 HTTP 요청의 쿠키를 읽어 쿠키 안의 세션 ID를 이용해 클라이언트를 식별할 수 있다.
Q. 세션을 사용하면 좋은데 왜 쿠키를 사용할까?
A. 세션이 쿠키에 비해 보안도 높은 편이나 쿠키를 사용하는 이유는 세션은 서버에 저장되고, 서버 자원을 사용하기 때문에 사용자가 많을 경우 소모되는 자원이 상당하다.
이러한 자원 관리 차원에서 쿠키와 세션을 적절한 요소 및 기능에 병행 사용하여, 서버 자원의 낭비를 방지하며 웹 사이트의 속도를 높일 수 있다.
좋은 정보 감사합니다 ^^