쿠키(cookie)와 세션(session)

kys95·2022년 9월 15일
0

HTTP 프로토콜의 Connectionless Protocol

서버와 클라이언트의 관계를 유지하는 웹서비스의 HTTP 프로토콜에서는 Connectionless Protocol 이라는 규칙이 있다.

한 번의 요청에 대해서 응답한 후 바로 연결을 해제하는 것이 Connectionless Protocol 인데, 실제 요청이 몇 천, 몇 만개되는 웹 서비스에서는 요청을 그때그때 해제하지 않고 유지하게 되면 서버에 과부하가 걸리게 되기 때문이다.

Connectionless Protocol로 인해 서버의 과부하를 막을 수는 있지만, 매번 페이지를 이동할 때마다 로그인을 다시 하거나,상품을 선택했는데 구매 페이지에서 선택한 상품의 정보가 없거나 하는 등의 일이 발생할 수 있다.

따라서 서버는 클라이언트가 누구인지 계속 인증을 해줘야 한다. 하지만 그것은 매우 귀찮고 번거로운 일이다.
그런 번거로움을 해결하는 방법이 바로 쿠키와 세션이다.

그러한 기능을 구현하기 위해, Connectionless Protocol을 지키고 자원의 효율적 관리와 정보 유지를 위해 세션과 쿠키를 사용한다.

세션 : 서버에서 연결 정보를 관리 (보안에 더 강하고 많이 쓰임)
쿠키 : 클라이언트에서 연결 정보를 관리 (세션보다 비교적 간단하고, 서버의 부화를 줄이기 위해 사용)

🍪 쿠키란?

  • 서버가 사용자의 웹 브라우저에 저장하는 데이터
    • 이때 브라우저마다 저장되는 쿠키가 다르다.
    • 예를 들어 크롬으로 받은 쿠키는 익스플로어에서 사용 불가
  • 데이터 형태는 key-value이며 String으로 이루어져 있다.
  • 쿠키는 서버를 대신해 정보를 웹 브라우저(클라이언트 컴퓨터)에 저장한다.
  • 사용자가 서버에 요청시, 쿠키를 함께 보내서 사용자를 식별할 수 있게 해준다.
    • 자동으로 Request header에 넣어서 전송해준다.

❌ 쿠키의 치명적인 단점 ❌

  1. 쿠키 값은 임의로 변경할 수 있다.
    • 클라이언트가 쿠키를 강제로 변경하면 다른 사용자가 된다.
  2. 쿠키에 보관된 정보는 훔쳐갈 수 있다.
    • 이 정보가 웹 브라우저에도 보관되고, 네트워크 요청마다 계속 클라이언트에서 서버로 전달된다.
  3. 해커가 쿠키를 한번 훔쳐가면 평생 사용할 수 있다.
    • 해커가 쿠키를 훔쳐가서 그 쿠키로 악의적인 요청을 계속 시도할 수 있다.

대안점은?

  1. 쿠키에 예측 불가능한 임의의 토큰을 노출해야 한다.
    단, 서버에서는 해석이 가능하게 한다.
  2. 토큰의 만료시간을 짧게(예: 30분) 유지하게 한다.
  3. 해킹이 의심되는 경우에는 서버에서 해당 토큰을 컨트롤할 수 있어야 한다.

이런 보안 문제 때문에 로그인 같은 예민한 정보를 저장할 때는 세션을 이용한다.

📌 쿠키와 세션 차이

  • 쿠키

    • 저장위치: 클라이언트
    • 사용 자원: 클라이언트의 리소스
    • 속도: 세션보다 빠르다.
    • 보안: 세션보다 취약
    • 저장형식: text
  • 세션

    • 저장위치: 서버
    • 사용 자원: 서버의 리소스 (주로 서버 메모리, 비싼 자원)
    • 속도: 쿠키보다 느림
    • 보안: 쿠키보다 좋음
    • 저장형식: Object

❌ 세션의 문제점 ❌

  • 기본적으로 HTTP 프로토콜은 비연결성(Connectionless), 비상태성(Stateless) 한 특징을 가진다.
    • 이 특징 때문에 쿠키, 세션을 사용한다.
  • 서버가 여러대 있고, 이를 로드 밸런싱으로 처리한다면?
  • 만약 사용자1이 서버1을 통해 로그인했다면, 세션은 서버1에 저장될 것이다.
    그렇다면 다음 요청시 항상 서버1에 요청한다는 보장이 있느냐? 아니다.
  • 따라서 모든 서버가 공동으로 사용하는 세션을 만들어야 한다.
    • DB를 사용한다면 I/O가 일어나기 때문에 속도가 매우매우 느려진다.
    • 속도를 위해 메모리 공유 서버를 사용할 수도 있다. (대표적으로 Redis)
      하지만.. 그 비싼 자원은 서버가 다 감당해야 하는가?

이에 대한 문제로 최근에는 토큰 기반의 인증 방식을 사용하는 추세이다.

정리

  • 쿠키와 세션을 사용하는 이유?
    HTTP 프로토콜의 특징이자 약점을 보완하기 위해서 사용한다.

  • 쿠키(Cookie)
    서버가 사용자의 웹 브라우저에 저장하는 데이터

  • 세션(Session)
    일정 시간 동안 같은 사용자(브라우저)로부터 들어오는 일련의 요구를 하나의 상태로 보고, 그 상태를 유지시키는 기술이다.

  • 쿠키와 세션의 차이
    쿠키와 세션은 비슷한 역할을 하며, 동작 원리도 비슷하다. 그 이유는 세션도 결국 쿠키를 사용하기 때문이다.

큰 차이점은 사용자의 정보가 저장되는 위치이다. 쿠키는 서버의 자원을 전혀 사용하지 않으며, 세션은 서버의 자원을 사용한다.

라이프 사이클은 쿠키도 만료기간이 있지만 파일로 저장되기 때문에 브라우저를 종료해도 정보가 유지될 수 있다. 또한 만료기간을 따로 지정해 쿠키를 삭제할 때까지 유지할 수도 있다.

반면에 세션도 만료기간을 정할 수 있지만, 브라우저가 종료되면 만료기간에 상관없이 삭제된다.

profile
어제의 나보다 나은 사람이 되자

0개의 댓글