본문으로 건너뛰기

쿠키와 세션

HTTP 프로토콜은 비연결성(Connectionless)이며 무상태성(Stateless)라는 특징을 지닌 프로토콜의 한 종류이다. 따라서 서버는 클라이언트가 누구인지 매번 확인해야한다. 이러한 특성을 보완하기 위해 쿠키와 세션을 사용할 수 있다.

비연결성이란 클라이언트가 서버에게 특정 요청을 했을 때, 해당 요청에 대한 응답 이후에 연결을 끊는 방식을 의미한다. 헤더에 keep-alive라는 값을 줘서 커넥션을 재활용하기도 하는데 HTTP1.1에서는 이것이 디폴트이다.

무상태성이란 통신이 끝나면 상태를 유지하지 않는 특성을 말한다. 연결을 끊는 순간 클라이언트와 서버의 통신이 끝나며 상태 정보는 유지하지 않는 특성이 있다. 무상태성라는 특징으로 인해 사용자는 다른 페이지로 넘어갈 때마다 로그인을 다시하거나, 특정 상품을 장바구니에 추가했는데 선택한 상품이 존재하지 않는 상황들이 발생할 수 있다. 즉, 클라이언트의 상태를 필요로하는 stateful한 특징을 띄는 서비스가 점점 많아졌다. 이러한 무상태성으로 인해 발생하는 사용자 경험을 해결하기 위해 생각해낸 것이 쿠키와 세션의 사용이다.

쿠키와 세션은 위의 두가지 특징을 해결하기 위해 사용한다. 즉 클라이언트와 주고 받는 정보를 유지하는 Stateful한 성격을 띄게하기 위해 사용되는 것이 쿠키와 세션이다.

Cookie란 사용자가 특정 웹 사이트에 방문할 경우, 웹 서버가 사용자의 컴퓨터에 파일 또는 메모리에 저장하는 작은 기록 정보 파일이다. 파일에 담긴 정보는 인터넷 사용자가 같은 웹 사이트를 다시 방문했을 때, 필요시 참고할 수 있는 정보를 의미한다.

  • 쿠키는 클라이언트의 상태 정보를 로컬에 저장했다가 참조한다.
  • Response Header에 Set-Cookie 속성을 사용하면 클라이언트에 쿠키를 만들 수 있다.
  • 이름(Name): 쿠키를 구별하는데 사용
  • 값(Value): 각 쿠키에 저장된 값을 의미
  • 유효기간(Expires): 쿠키가 유지되는 기간을 의미
  • 도메인(Domain): 쿠키가 사용되는 도메인을 의미
  • 경로(path): 쿠키를 전송할 경로를 의미

Cookie의 종류

쿠키의 종류는 크게 4가지가 존재한다.

  1. Session Cookie: 만료시간을 설정하고 메모리에만 저장되며 브라우저 종료시 해당 쿠키는 삭제된다.
  2. Persistent Cookie: 장기간 유지되는 쿠키이며, 파일로 저장되어 브라우저 종료와 관계없이 사용할 수 있다.
  3. Secure Cookie: HTTPS에서만 사용되며, 쿠키 정보가 암호화되어 전송된다.
  4. Third-Party Cookie: 유입 경로를 추적하기 위해 사용되며, 광고 배너 등을 관리할 때 사용된다.

Cookie의 동작 원리

  1. 클라이언트가 페이지를 요청한다.
  2. 서버는 쿠키를 생성한다.
  3. HTTP 헤더에 생성한 쿠키를 포함시켜 응답한다.
  4. 넘겨 받은 쿠키 만료 기간이 될때까지 클라이언트에서 보관한다.
  5. 같은 요청을 하는 경우 HTTP 헤더에 쿠키를 함께 전송한다.
  6. 서버는 전달받은 쿠키를 읽어 이전 상태 정보를 변경할 필요가 있을 때 쿠키를 업데이트하여 변경된 쿠키를 HTTP 헤더에 포함시켜 응답

해당 방식으로 작동하는 Cookie를 통해 아이디와 비밀번호를 기억한 후, 자동 입력 해주는 자동 로그인과 특정 웹 사이트 팝업창의 "오늘 이 창을 다시 보지 않기"와 같은 기능을 제공해준다.

Cookie의 문제점

HTTP의 무상태성이라는 특징 때문에 서버는 지금 요청하는 클라이언트가 인증된 유저(authunticate) 인지 알 길이 없고, 응답하기 전에 매번 인증을 거쳐야 합니다. 이러한 무상태성의 단점을 보완하는것이 세션의 존재 이유입니다. 다시 말해 세션은 응답자가 요청자의 상태를 저장하는 것입니다. 세션은 다양한 곳에 형성될 수 있씁니다. 웹 서버의 인메모리 저장소일 수도 있고, API 서버에 붙어있는 데이터베이스일 수도 있습니다.'

Stateless를 극복하기 위함이다.

요청자가 브라우저가 아니라면 애초에 쿠키라는 저장소는 존재하지 않는다.

HTTP 통신의 특징으로는 비연결성(Connectionless)과 무상태성(Stateless)이 있습니다. 비 연결성은 통신 주체 간의 연결을 유지하지 않음으로 리소스를 아끼는 등의 이득을 취하는 것을 말하고, 무상태성은 클라이언트의 정보를 서버가 유지하지 않음으로, 응답의 멱등성과 서버 scale out의 확장성등의 이득을 취하는 것을 말합니다.

Session

  • 세션 역시 쿠키형태로 데이터를 식별하지만 브라우저에 저장하지 않고 서버 측에서 관리를 한다.
  • 서버에서는 클라이언트를 구분하기 위해 세션 ID를 부여하며 웹 브라우저가 서버에 접속해서 브라우저를 종료할 때까지 인증상태를 유지한다.
  • 사용자에 대한 정보를 서버에 두기 때문에 쿠키보다 보안에 좋지만, 사용자가 많아질수록 서버 메모리를 많이 차지하게 된다.
  • 동접자 수가 많ㅇ느 웹 사이트인 경우 서버에 과부하를 주게 되므로 성능 저하의 요인이 된다.

Session의 동작 원리

  1. 클라이언트가 서버에 특정 데이터를 요청한다.
  2. 서버는 HTTP 요청을 통해 쿠키에서 Session id를 확인한 후, 쿠키가 존재하지 않으면 Set-Cookie를 통해 3. 새로 발행한 Session-id를 전송한다.
  3. 클라이언트는 HTTP 헤더에 전달받은 Session id 포함하여 데이터 요청을 진행한다.
  4. 서버는 Session id를 통해 클라이언트 상태 정보를 유지하며 적절한 응답을 진행한다.

위 방법을 통해 화면을 이동해도 로그인이 풀리지 않고 로그아웃하기 전 또는 브라우저를 종료할 때까지 로그인이 유지되는 기능을 가능하게 한다. 서버를 쿠키를 저장하기에 관리하기가 매우 편하고 보안 면에서도 쿠키보다 훨씬 우수하다.

Session의 문제점

서버에 쿠키를 저장하기에 사용자가 많아질수록 서버 메모리를 많이 차지하기에 속도와 비용의 문제가 발생할 수 있다. 또한 세션 정보를 하나의 저장장치에 공유하며 사용하기 떄문에 load-balancing 문제가 발생한다.

쿠키와 세션의 차이

  • 쿠키와 세션은 비슷한 역할을 하며 동작원리도 비슷하다.(세션도 쿠키를 사용)
  • 가장 큰 차이점은 사용자의 정보가 저장되는 위치이다. 쿠키는 서버의 자원을 전혀 사용하지 않으며, 세션은 서버의 자원을 사용한다.
  • 보안 면에서 세션이 우수하며, 요청 속도는 쿠키가 세션보다 빠르다. 세션은 서버의 처리가 필요하기 때문이다.
  • 보안, 쿠키는 클라이언트 로컬에 저장되기 때문에 변질되거나 request에서 스니핑 당할 우려가 있어서 보안에 취약하지만 세션은 쿠키를 이용해서 sessionid만 저장하고 그것으로 서버에서 처리하기 때문에 비교적 보안성이 좋다.

결론

쿠키와 세션은 모두 쿠키를 기반으로 작동하지만 정보가 저장되는 위치가 브라우저인지 서버인지의 차이가 있다. 보안 측면에서는 세션이 서버에 저장되기에 쿠키보다 우수하지만, 속도 측면에서는 쿠키가 서버의 처리를 필요로하는 세션보다 훨씬 빠르다.

Reference