우리가 흔히 이용하는 웹 브라우저는 HTTP 프로토콜
로 되어 있다. HTTP 프로토콜 환경
은 기본적으로 "connectionless, stateless"한 특성을 가지기 때문에 서버에서는 클라이언트가 접속할 때마다 누구인지 확인을 해야하는 수고스러움이 생기는 것이다. 바로 이러한 점을 보완하기 위하여 세션
과 쿠키
를 사용한다.
여기서 "connectionless, stateless"는 무엇인지 간단하게 짚고 넘어가자.
서버와의 연결을 끊어
버리는 특징상태를 유지하지 않는
특징클라이언트로부터 요청이 들어오면 서버가 요청에 대한 응답을 한다. 서버는 응답이 완료되면 클라이언트와 서버 자신의 연결을 끊어버리는 것이다. 또한, HTTP
는 서버와 연결이 끊겨서 더 이상 통신하지 않는다면 그 상태를 유지하지 않는다는 것이 위 특징에 대한 것이다. 즉, 서버는 클라이언트가 접속(요청)
을 할 때마다 반복적으로 클라이언트를 확인해야하는 상황이 발생한다. 이렇게되면 클라이언트는 서버를 이용하는 동안 계속된 로그인을 겪어야하며 로그인을 했음에도 불구하고 페이지가 이동되면 다시 로그인을 해야하는 상황들이 발생한다. 이러한 부분을 방지하기 위해 세션
과 쿠키
를 사용한다는 것을 다시 한번 새겨두자.
쿠키는 클라이언트의 로컬에 저장되는 'key'와 'value'가 들어있는 작은 데이터 파일이다.
쿠키는 클라이언트의 상태 정보를 로컬에 저장
했다가 참조할 수 있으며, 사용자 인증이 유효한 시간을 명시할 수도 있다. 또한, 유효시간이 정해지면 브라우저가 종료되어도 인증이 유지될 수 있는 특징을 가진다.
쿠키의 능력은 클라이언트에 300개까지 쿠키 저장이 가능
하고, 하나의 도메인당 20개의 값
만 가질 수 있다. 이러한 쿠키 하나의 데이터는 4Kb까지 저장
이 가능하다. 쿠키는 따로 사용자가 요청하지 않아도 브라우저가 요청(Request)
을 할 때 Request Header
를 넣어서 자동으로 서버로 전송한다.
클라이언트가 서버에게 최초의 요청
을 발생시키면 서버에서는 쿠키를 생성
한다. 생성된 쿠키는 HTTP 응답 헤더
에 포함되어 클라이언트에게 응답이 되고, 연결은 끊어진다. 연결이 끊어지더라도 서버에서 보낸 쿠키는 클라이언트가 브라우저를 실행하는 동안 보유하고 있다. 쿠키를 보유한 클라이언트가 서버에 재요청을 보내면 서버는 HTTP 요청 헤더
에 포함되어 온 쿠키를 읽어 이전상태 정보
가 있는지 확인 후 업데이트하여 그림의 3번 과정부터 다시 반복한다. 이러한 원리로 이전에 접속한 클라이언트인지 인식할 수 있으며, 해당 브라우저를 통해 이용한 서비스에 대한 정보를 쿠키를 통해서 담아둘 수 있는 것이다.
쿠키는 이러한 동작원리를 기반으로 방문 사이트에서 로그인 시 아이디와 비밀번호를 저장한다던가 또는 쇼핑몰의 장바구니 기능 등을 가능하게함
통신을 하기 위해 서로 연결된 순간부터 통신을 마칠 때 까지의 기간을 의미
서버에서의 세션의 의미는 보통 세션에 대한 정보를 저장해두고 쿠키를 클라이언트에게 응답하여 서버가 클라이언트를 식별 할 수 있도록 하는 방식
서버에서는 클라이언트를 구분하기 위해 세션 ID
를 부여하여 브라우저가 서버에 접속해서 브라우저를 종료할 때까지 인증상태를 유지한다. 사용자에 대한 정보를 서버에 두는 측면에서 쿠키보다 보안에 좋다. 하지만 단점으로는 서버에 사용자에 대한 정보를 두다보니 사용자가 많아질수록 서버 메모리를 많이 차지
하게되어 속도 저하가 발생 할 수 있다.
세션 ID는 클라이언트가 최초로 요청을 보내면, 해당 서버의 엔진이 클라이언트에게 유일한 ID를 부여하는 것
쿠키와 동작원리는 비슷하다. 다만, 서버의 관점에서 보면 최초의 클라이언트 요청이 들어오면 서버는 세션 객체를 생성
하고 ID를 발급
한다. 발급된 ID는 클라이언트 쿠키에 저장되어 응답 헤더로 보내진다. 쿠키를 보유한 클라이언트가 서버로 재요청을 보내면 서버에서는 쿠키에 저장된 ID를 통해 세션에 있는 클라이언트의 정보로 요청을 처리한 후 클라이언트에게 요청에 대한 응답을 한다.
위와 같은 동작을 하기 위해서 세션이 가지는 특징을 보자.
또한 세션에 대한 정보는 Servlet
에서 생성하더라도 jsp
의 내장객체인 session 객체
를 통해 해당 정보를 가져올 수 있다. 즉, 서버 자체에 객체가 생성되기 때문에 요청(Request) 객체의 getSession() 메서드
를 통해서 해당 정보를 가져올 수 있는 것이다.
이번 글에서는 세션과 쿠키에 대해서 알아보았다. 마지막으로 세션과 쿠키의 차이점을 나열하고 이번 글을 마치겠다.
쿠키가 필요한 이유는 서버의 자원의 무분별한 사용을 방지하고, 서버의 메모리 관리를 효율적으로 하기 위해서이다. 또한, 간단한 정보만을 포함한 쿠키를 이용하여 클라이언트의 요청 전송속도를 빠르게 보장할 수 있기 때문에 각자의 역할에 맞게 사용하기 위해서이다.
<참고>
https://interconnection.tistory.com/74
https://noahlogs.tistory.com/38