Published on

[ Network ] 쿠키와 세션

Authors
  • avatar
    Name
    유사공대생
    Twitter

HTTP의 특징과 쿠키와 세션을 사용하는 이유

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

기본적으로 HTTP 프로토콜 환경은 "connectionless, stateless"한 특성을 가지기 때문에 서버는 클라이언트가 누구인지 매번 확인해야 한다. 이 특성을 보완하기 위해서 쿠키와 세션을 사용하게 된다.

connectionless

HTTP 프로토콜은 기본적으로 connectionless 프로토콜이다. Connectionless란 각 요청과 응답이 서로 독립적으로 처리되며, 이전 요청이나 응답과의 상태를 유지하지 않는 것을 말한다. HTTP는 클라이언트가 서버에 요청을 보내고, 서버는 해당 요청에 대한 응답을 보낸 후에 연결을 바로 끊는 방식으로 동작한다.

즉, 각각의 HTTP 요청은 서버에 도착하고 처리되면 연결이 닫히게 되며, 다음 요청은 이전 요청과 아무런 관련이 없이 새로운 연결로 처리된다. 이는 상태를 저장하지 않고 빠르게 데이터를 주고 받을 수 있는 장점을 가지고 있지만, 동일한 클라이언트의 여러 요청 간에 연결 상태를 유지하지 않기 때문에 추가적인 정보 교환에 대한 처리가 필요하다.

HTTP/1.1부터는 keep-alive라는 기능을 통해 하나의 연결을 여러 요청과 응답에 재사용하여 성능을 향상시키는 기능이 추가되었다. 이를 통해 한 번의 TCP 연결을 통해 여러 개의 요청과 응답을 주고 받을 수 있어 연결을 반복적으로 맺고 끊는 데 필요한 시간과 리소스를 절약할 수 있다.

TCP는 연결지향적인 프로토콜로, 데이터를 주고받기 전에 연결을 설정하고, 연결을 유지한 채로 데이터를 안정적으로 전송한 후에 연결을 해제한다. 반면에 UDP는 비연결지향적인 프로토콜로, 데이터를 전송할 때 연결 설정과 관련된 작업 없이 데이터를 보내고 받는다.

stateless

Stateless란 각각의 요청이 서버에 의해 이전의 요청과는 독립적으로 처리되며, 서버는 클라이언트의 상태를 보존하지 않는 것을 의미한다. 간단히 말해, 이전 요청이나 응답과의 상태를 서버가 기억하고 있지 않는 상태를 나타낸다.

HTTP 프로토콜은 stateless 프로토콜로, 각각의 요청은 서로 완전히 독립적으로 처리된다. 서버는 클라이언트의 상태를 기억하지 않기 때문에, 같은 클라이언트가 이전에 보낸 요청에 대한 정보를 기억하거나 유지하지 않는다. 예를 들어, 클라이언트가 로그인을 한 후에 다음 요청에서는 다시 로그인 정보를 제공해야 한다. 서버는 이전에 클라이언트가 보낸 요청에 대한 정보를 저장하지 않으므로 각각의 요청은 독립적으로 처리된다.

Stateless 프로토콜의 장점은 서버가 클라이언트의 상태를 유지하지 않아서 확장성이 좋고 서버의 부하를 줄일 수 있다는 것이다. 하지만 상태 정보를 유지하지 않기 때문에 클라이언트의 상태를 계속 전달해야 하는 번거로움이 있다. 이를 해결하기 위해 세션, 쿠키 등의 메커니즘이 사용되어 클라이언트의 상태 정보를 유지하고 처리할 수 있게 한다.

쿠키(Cookie)

쿠키란?

쿠키는 클라이언트(브라우저) 로컬에 저장되는 키와 값이 들어있는 작은 데이터 파일이다.

사용자 인증이 유효한 시간을 명시할 수 있으며, 유효 시간이 정해지면 브라우저가 종료되어도 인증이 유지된다는 특징이 있다.

쿠키는 클라이언트의 상태 정보를 로컬에 저장했다가 참조한다.

클라이언트에 300개까지 쿠키저장 가능, 하나의 도메인당 20개의 값만 가질 수 있음, 하나의 쿠키값은 4KB까지 저장한다.

Response Header에 Set-Cookie 속성을 사용하면 클라이언트에 쿠키를 만들 수 있다.

쿠키는 사용자가 따로 요청하지 않아도 브라우저가 Request시에 Request Header를 넣어서 자동으로 서버에 전송한다.

쿠키의 구성 요소

image

  • 이름 : 각각의 쿠키를 구별하는 데 사용되는 이름
  • 값 : 쿠키의 이름과 관련된 값
  • 유효시간 : 쿠키의 유지시간
  • 도메인 : 쿠키를 전송할 도메인
  • 경로 : 쿠키를 전송할 요청 경로

쿠키의 동작 방식

image

  1. 클라이언트가 페이지를 요청
  2. 서버에서 쿠키를 생성
  3. HTTP 헤더에 쿠키를 포함 시켜 응답
  4. 브라우저가 종료되어도 쿠키 만료 기간이 있다면 클라이언트에서 보관하고 있음
  5. 같은 요청을 할 경우 HTTP 헤더에 쿠키를 함께 보냄
  6. 서버에서 쿠키를 읽어 이전 상태 정보를 변경 할 필요가 있을 때 쿠키를 업데이트 하여 변경된 쿠키를 HTTP 헤더에 포함시켜 응답

세션(Session)

세션이란?

세션은 서버 측에서 사용자의 상태를 관리하고 저장된다. 클라이언트가 서버에 접속하면 서버는 그 클라이언트에 대한 고유한 세션 ID를 부여하여 클라이언트를 식별하고, 이 세션 ID를 사용해 상태를 유지한다. 보안 면에서는 쿠키보다 안전하고, 클라이언트가 세션 ID를 변경할 수 없도록 서버 측에서 관리하기 때문에 보안에 더 강하게 작용된다.

하지만 세션은 서버 메모리를 사용하기 때문에 많은 사용자를 다루는 웹사이트의 경우 서버 부하와 메모리 소비량이 늘어날 수 있다. 또한, 사용자가 세션을 생성하면 해당 서버에 계속 연결돼 있어야 하므로, 연결 시간을 설정하여 일정 시간동안 응답이 없으면 세션 정보를 삭제하도록 설정할 수 있다.

세션의 동작 방식

image

  1. 클라이언트가 서버에 접속 시 세션 ID를 발급 받음

image

  1. 클라이언트는 세션 ID에 대해 쿠키를 사용해서 저장하고 가지고 있음

image

  1. 클라리언트는 서버에 요청할 때, 이 쿠키의 세션 ID를 같이 서버에 전달해서 요청 4. 서버는 세션 ID를 전달 받아서 별다른 작업없이 세션 ID로 세션에 있는 클라언트 정보를 가져와서 사용 5. 클라이언트 정보를 가지고 서버 요청을 처리하여 클라이언트에게 응답

세션의 특징

각 클라이언트에게 고유 ID를 부여

세션 ID로 클라이언트를 구분해서 클라이언트의 요구에 맞는 서비스를 제공

보안 면에서 쿠키보다 우수

사용자가 많아질수록 서버 메모리를 많이 차지하게 됨

쿠키와 세션의 차이점

  1. 저장 위치
  • 쿠키: 클라이언트 측에 저장됨. 브라우저가 쿠키를 관리하며, 로컬에 저장되어 해당 도메인에 대한 모든 요청에 함께 전송됨.
  • 세션: 서버 측에 저장됨. 세션 ID가 클라이언트에게 부여되고, 이 ID를 사용하여 서버에서 세션 데이터를 관리함.
  1. 보안
  • 쿠키: 일반적으로 클라이언트 측에 저장되기 때문에 보안에 취약할 수 있음. 하지만 안전한 쿠키 사용을 위해 HTTPS와 같은 보안 프로토콜을 사용할 수 있음.
  • 세션: 서버에 저장되기 때문에 쿠키보다는 보안적으로 더 강력함. 세션 ID만 클라이언트에 전달되므로 데이터 유출 가능성이 낮음.
  1. 저장 기간
  • 쿠키: 만료일을 설정하여 장기간 유지되거나, 세션 쿠키로 설정하여 브라우저가 종료될 때까지만 유지될 수 있음.
  • 세션: 일반적으로 사용자가 로그아웃하거나 브라우저를 닫을 때까지 유지되며, 일정 시간 응답이 없을 경우 서버 측에서 세션을 만료시킬 수 있음.
  1. 서버 부하
  • 쿠키: 클라이언트 측에 저장되어 서버 부하가 적음.
  • 세션: 서버에 저장되기 때문에 많은 사용자가 접속할 경우 서버 부하가 증가할 수 있음.

출처