쿠키, 세션 그리고 웹 스토리지
브라우저 저장소 - LocalStorage, SessionStorage, Cookie
쿠키와 세션 개념
WEB 통신은 HTTP 프로토콜을 통하여 이루어진다.
이러한 HTTP 통신은 아래처럼 2가지 특징이 있다.
즉, 로그인정보 혹은 브라우저에 입력한 값같은 데이터들은 페이지를 이동할 때 마다 초기화 되는 것이다.
이러한 문제를 해결하기 위해 사용하는것이 브라우저 저장소(쿠키, 세션, 웹스토리지) 이다.
쿠키는 클라이언트 로컬에 저장되는 키와 값 형태의 작은 파일이다.(4KB 까지만 저장가능)
사용자 인증이 유효한 시간을 명시할 수 있고, 유효시간이 정해지면 브라우저가 종료되어도 인증이 유지된다.
HTTP Response Header에 Set-Cookie 속성을 사용하면 클라이언트에 쿠키를 만들 수 있다.
어느 고수의 설명
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
세션과 쿠키 개념이 헷갈리시는 분들이 있으신데, 세션은 서버에서 가지고 있는 정보이며 쿠키는 사용자에게 발급된 세션을 열기 위한 열쇠(SESSION ID)를 의미합니다. 쿠키만으로 인증을 사용한다는 말은 서버의 자원은 사용하지 않는다는 것이며, 이는 즉 클라이언트가 인증 정보를 책임지게 됩니다. 그렇게 되면 위의 첫번째 방식처럼 HTTP 요청을 탈취당할 경우 다 털리게 됩니다. 따라서 보안과는 상관없는 단순히 장바구니나 자동로그인 설정 같은 경우에는 유용하게 쓰입니다.
결과적으로 인증의 책임을 서버가 지게하기 위해 세션을 사용하는 겁니다(사용자가 해킹당하는 것보단 서버가 해킹당하는게 훨씬 어려우니까요!) 사용자(클라이언트)는 쿠키를 이용하고, 서버에서는 쿠키를 받아 세션의 정보를 접근하는 방식으로 인증을 합니다.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
세션은 일정 시간동안 같은 브라우저로 부터 들어오는 일련의 요구를 하나의 상태로 보고 그 상태를 유지하는 기술이다.
HTTP의 stateless 특성을 보완하기 위한 방법이다.
서버에서 HTTP Response의 Set-Cookie를 통해 클라이언트에게 유일한 ID값(세션 ID)을 생성해 부여하고
사용자로부터 받은 보안이 필요한 사용자 정보는 안전한 서버에 존재하며 클라이언트와 서버간에는 ID값만을 이용하여 식별 하여 보안위협을 감소시키는것이다.
위의 차이점 중 세션은 브라우저가 종료 시 삭제된다하였는데, 서버에서 도대체 어떻게 브라우저의 종료여부를 안다는 걸까?
사실 엄밀히 말하면 서버에서 가지고있는 세션정보는 일정기간동안 사라지지 않는다.
진짜 사라지는건 브라우저에서의 세션정보다.
서버에서 보내주는 세션 ID는 브라우저의 세션 쿠키에 저장되고 이 세션쿠키의 특징은 웹브라우저가 종료되면 삭제되는 특징을 가지고 있다.
우리의 WEB은 기본적으로 위와같이 동작한다.
클라이언트(브라우저)는 서버에게 정보를 요청하고 서버는 클라이언트가 요청한 데이터를 응답해준다.
이러한 요청과 응답은 모두 돈이며 개발자는 적은 돈으로 최대의 효과를 내어야한다.
하여 보안이 필요하지 않으며 적은 용량의 데이터들은 굳이 서버에 저장하지 않고 클라이언트단에서 저장한 뒤
서버의 요청없이 빠르게 가져다 쓸 수 있는 데이터공간의 필요성이 생겼고
그것이 바로 웹 스토리지다.
또한 쿠키는 매번 서버로 전송된다.
웹사이트에서 쿠키를 설정하면 이후 모든 웹 요청은 쿠키정보를 포함해 서버로 전송된다.
하지만 웹스토리지는 저장된 데이터가 클라이언트에 존재할 뿐 서버로 전송되지 않는다.
이는 또한 네트워크 트래픽 비용을 줄여준다.
웹스토리지는 로컬스토리지와 세션스토리지를 통틀어서 지칭하는 말이며
내부적으로는 영구저장소(LocalStorage)와 임시저장소(SessionStorage)가 분리되어 데이터 지속성에 따라 선택적으로 사용이 가능하다.
쿠키와 캐시 모두 클라이언트의 로컬에 저장되는것이지만 그 차이는 아래와 같다.