HTTP 강의에서 쿠키와 세션에 대해서 간단하게 설명하는 구간에 있어
내가 아는 지식은 이렇게 간단하지만은 않다고 생각해서 이참에 정리를 통해
개념을 좀 더 잡고 가고자 이렇게 쿠키와 세션에 대해서 글로 작성하게 됐다.
그렇다면 쿠키와 세션을 왜 사용하는지부터 시작하면서 글을 시작하겠다.
왜 사용하는가를 먼저 파헤치기 위해서는 먼저 HTTP 프로토콜에 대해서 먼저 인지를 하고 있어야 한다.
그렇다면 HTTP 프로토콜은 무엇인가?
리소스를 가져올 수 있게 도와주는 프로토콜 이라는 점을 인지하고 가자!
그렇다면 가져올 수 있게끔하는데 있어서는 대표적으로 2가지가 있다.
위 두 가지 방식으로 클라이언트 서버는 서로 통신을 하면서 데이터에 대한 교환이 이루어집니다.
하지만!!
HTTP에 대한 기초적인 측면은 정말 다양한 측면이 있다. 하지만 두 가지의 측면으로 인해 쿠키와 세션을 사용하는 이유가 담겨져 있습니다.
위에서 HTTP는 웹에서 이루어지는 모든 데이터 교환에 대한 기초가 있으며, 이에 대한 교환은 Request와 Response를 통해 이루어진다고 언급했습니다.
하지만 HTTP는 이러한 특성을 가지고 있다.
교환에 대한 상태는 HTTP에서 저장을 하지 않고(Stateless)
한번의 요청과 응답 이후에는 연결을 종료 합니다.(Connectionless)
위 두가지 특성으로 인해 쿠기와 세션을 사용하게 됩니다.
Connectionless
의 의미는 클라이언트의 요청 && 응답 이후에는 연결을 종료 한다라는 의미를 담기고 있다.
이러한 구성의 의미는 실제로 1시간 동안 수천 명의 서비스를 사용해도, 실제 서버에서의 동시 처리 요청은 매우 적다. 그렇기에 서버 자원을 효율적으로 사용할 수 있다
예를 들어 생각해 보면 편하다. 수십만 명이 웹을 사용한다고 하더라도 접속 유지는 최소한으로 할 수 있기 때문에 더 많은 사용자의 요청을 처리할 수 있기 때문이다 이는 웹에서의 매우 큰 장점으로써 활용되기 때문이다.
하지만 이러한 Connectionless
에 대한 분명한 단점 또한 있다.
이유는 끊어버리는 행위로 인해 HTTP에서는 데이터를 저장하지 않고 있다. 그렇다면 서버도 모르고 HTTP도 모른 상태가 된다. 이러한 상태를 Stateless
라고 불린다.
Stateless라는 단어까지 알아봤다면 어떻게 보면 유사하다고 생각을 할 수 있다. HTTP가 요청에 대한 응답 이후 끊어버리는 것과 데이터를 저장하지 않는 상태 stateless
와 매우 어떻게 보면 비슷한 맥락을 가지고 있다.
이러한 이유는 stateless
방법은 connectionless
에서 파생된 특징이라고 할수 있기 때문이다.
그렇다면 위 두 가지 특징이 합쳐졌을 때 결국에는 어떤 사용자가 어떤 상태인지 판별하기가 어렵다. 마치 이런 거와 같다. 로그인을 했는데 HTTP는 로그인을한 사용자인지 아닌지는 판별할 수가 없다.
그렇기에 여기서는 세션
OR 쿠키
를 통해서 로그인에 대한 정보를 유지할 수가 있다.
이제 본론으로 넘어가자!!
쿠키는 일명 클라이언트(브라우저) 로컬에 저장되는 키와 값이 들어있는 작은 데이터 조각이다.
쿠키를 통한 HTTP프로톨에서 상태 정보 기억하는법
브라우저에서 이러한 데이터를 저장해 놓았다가 동일한 서버에 재요청 시 저장된 데이터를 함께 전송한다. 쿠키는 두 요청이 동일한 브러우저에서 들어왔는지 아닌지를 판단할 때 주로 사용이 된다.
이를 사용하게 된다면 사용자의 로그인 상태를 유지할 수 있다.
쿠키의 동작 방식
클라이언트가 페이지를 요청
서버에서 쿠키를 생성
HTTP 헤더에 쿠키를 포함 시켜 응답
브라우저가 종료되어도 쿠키 만료 기간이 있다면 클라이언트에서 보관하고 있음
같은 요청을 할 경우 HTTP 헤더에 쿠키를 함께 보냄
서버에서 쿠키를 읽어 이전 상태 정보를 변경 할 필요가 있을 때 쿠키를 업데이트 하여 변경된 쿠키를 HTTP 헤더에 포함시켜 응답
또 다른 목적
쿠키는 동일한 브라우저에 요청인지 아닌지를 판단한다고 했다. 하지만 이렇게 단순하고 중요할 수 있는 생태를 저장뿐만 아니라 다르게도 쓰인다.
세션 관리 :서버에 저장해야 할 로그인, 장바구니, 게임 스코어 등의 정보 관리
개인화 : 사용자 행동을 기록하고 분석하는 용도
트래킹 : 사용자 행동을 기록하고 분석하는 용도
세션 방식도 목적은 같다. 사용자를 식별하기 위함이다. 다만 다른 점이라면 쿠키와 달리 세션은 서버 측에서 관리하는 방식이다.
세션을 통한 HTTP프로톨에서 상태 정보 기억하는법
서버에서는 클라이언트를 구분하기 위해 세션 ID를 부여하고 웹 브라우저가 서버에 접속해서 브라우저의 요청을 종료할 때까지 인증 상태를 유지함
해당 방법은 결국 브라우저 메모리에(세션 정보를 set-cookie에 담음) 저장이 되며 이러한 정보는 쿠키와 같은 소멸 기간이 있는 Memory cookie로 사용이 된다.
세션의 동작 방식
클라이언트가 서버에 접속 시 세션 ID를 발급 받음
클라이언트는 세션 ID에 대해 쿠키를 사용해서 저장하고 가지고 있음
클라리언트는 서버에 요청할 때, 이 쿠키의 세션 ID를 같이 서버에 전달해서 요청
서버는 세션 ID를 전달 받아서 별다른 작업없이 세션 ID로 세션에 있는 클라언트 정보를 가져와서 사용
클라이언트 정보를 가지고 서버 요청을 처리하여 클라이언트에게 응답
지금까지 알아봤다면 어떻게 보면 둘 다 비슷한 동작 원리를 가지고 있습니다. 그거에 대한 이유 또한 둘 다 서로를 사용하고 있기에 어떻게 보면 같은 맥락이라고 할 수 있습니다.
다만 차이라고 한다면 저장하는 곳
에서 차이가 생깁니다. 쿠키는 서버 자원을 전혀 사용하지 않는 방면 세션은 서버 자원을 사용하기 때문이죠
하지만 명확하고 둘 다 우수한 면이 있고 없고는 있습니다.
보안성이 나음
속도는 쿠키가 빠름 -> 세션은 서버의 처리가 필요
세션을 무분별하게 사용할 경우
서버의 자원을 사용하기 때문에 서버의 메모리를 감당하기 여려움
그렇다면 쿠키와 세션에 대한 명확한 차이는 저장하는 곳
, 보안
인가?
명확하게는 아니다. 정답은 라이프 사이클에 큰 차이를 보인다.
쿠키에서는 만료 시간이 있고 이는 사실상 파일로 저장된다. 그렇기에 브라우저를 종료해도 계속해서 정보가 남는다.
반면 세션 또한 만료 시간을 지정할 수 있다. 다만 브라우저가 종료된다면 만료 시간에 상관없이 삭제 된다.
이상으로 긴 글을 읽어주셔서 감사합니다.
귀중한 자료 제공을 해주신 분들께 감사합니다. 덕분에 공부가 됐습니다.
https://interconnection.tistory.com/74
https://shlee0882.tistory.com/107
https://mohwaproject.tistory.com/entry/HTTP-Session-%EC%9D%B4%EB%9E%80
https://developer.mozilla.org/ko/docs/Web/HTTP/Overview