[SK shieldus Rookies 19기][애플리케이션 보안] Cookie(쿠키), Session(세션)

Sungwuk·2024년 3월 31일
0

쿠키와 세션을 사용하는 이유는?

Stateless 한 HTTP 프로토콜에서 요청과 요청 간의 관계를 유지하기 위해서 도입된 개념

HTTP의 특징

Connection-oriented: HTTP는 기본적으로 연결을 유지하지 않는 상태로 동작. 즉, 클라이언트가 서버에 요청을 보내면 서버는 응답을 보내고 연결을 종료. 이후의 요청은 새로운 연결을 통해 이루어진다.

Stateless: HTTP는 상태를 유지하지 않는 프로토콜이다. 즉, 각각의 요청은 이전 요청과는 독립적으로 처리된다. 이는 서버가 클라이언트의 상태를 기억하지 않는다는 것을 의미. 이 특징은 서버의 부하를 줄이고 확장성을 향상시킨다.

하지만, 실제로는 상태, 데이터 유지가 필요한 경우가 많다.

정보가 유지되지 않으면, 매번 페이지를 이동할 때마다 로그인을 다시 하거나, 결제정보가 사라지는 일이 발생 할 수 있다. 따라서, Stateful 경우를 대처하기 위해 쿠키와 세션을 사용한다. 쿠키와 세션의 차이점은 크게 상태 정보의 저장 위치이다. 쿠키는 '클라이언트(=브라우저)'에 저장하고, 세션은 '서버'에 저장한다.

연속적 통신을 위해 사용하는것이 쿠키와 세션이다.


Cookie(쿠키)

HTTP 쿠키(웹 쿠키, 브라우저 쿠키)는 서버가 사용자의 웹 브라우저에 전송하는 작은 데이터 조각입니다. 브라우저는 그 데이터 조각들을 저장해 놓았다가, 동일한 서버에 재 요청 시 저장된 데이터를 함께 전송. 쿠키는 두 요청이 동일한 브라우저에서 들어왔는지 아닌지를 판단할 때 주로 사용. 이를 이용하면 사용자의 로그인 상태를 유지할 수 있다. 상태가 없는(stateless) HTTP 프로토콜에서 상태 정보를 기억시켜주기 때문.

유형

  • 세션 쿠키(Session Cookies): 일시적이며 사용자가 브라우저를 닫으면 지워진다. 세션 관리를 위해 사용.
  • 지속적 쿠키(Persistent Cookies): 사용자의 장치에 저장되어 브라우저를 닫은 후에도 유지. 로그인 정보나 사용자 환경 설정을 기억하는 데 사용.

동작 순서

  • 사용자가 웹사이트에 접근
  • 웹 서버는 쿠키를 생성
  • 생성한 쿠키에 정보를 담아 HTTP 화면을 돌려줄 때, 같이 사용자에게 돌려준다.
  • 넘겨받은 쿠키는 클라이언트가 가지고 있다가(브라우저에 저장) 다시 서버에 요청할 때 요청과 함께 쿠키를 전송한다.
  • 동일 사이트 재방문 시 클라이언트의 PC에 해당 쿠키가 있는 경우, 요청 페이지와 함께 쿠키를 전송한다.

Session(세션)

세션은 일정시간 동안 여러 페이지 요청 사이에서 사용자에 대한 정보를 저장하는 방법. 쿠키와 달리 세션 데이터는 서버에 저장. 일정시간이 지나면 연결을 종료.

특징

  • 서버에 컨테이너의 상태를 유지하기 위한 정보를 저장
  • 브라우저를 닫거나, 서버에서 세션을 삭제했을 때만 삭제가 되므로, 쿠키보다 비교적 보안이 좋다.
  • 저장 데이터에 제한이 없다. (서버 용량이 허용하는 한에서)
  • 각 클라이언트에 고유 Session ID를 부여. Session ID로 클라이언트를 구분해 각 요구에 맞는 서비스를 제공

동작 순서

  • 클라이언트가 페이지에 요청
  • 서버는 접근한 클라이언트의 Request-Header 필드인 Cookie를 확인하여, 클라이언트가 해당 session-id를 보냈는지 확인
  • session-id가 존재하지 않는다면 서버는 session-id를 생성해 클라이언트에게 전송
  • 클라이언트는 서버로부터 받은 session-id를 쿠키에 저장
  • 클라이언트는 서버에 요청시 이 쿠키의 session-id 값을 같이 서버에 전달
  • 서버는 전달받은 session-id로 session에 있는 클라이언트 정보를 가지고 요청을 처리 후 응답

쿠키와 세션의 차이

1. 저장 위치

  • 쿠키: 클라이언트에 저장되며, 클라이언트가 서버에 요청을 보낼 때마다 요청과 함께 서버로 전송

  • 세션: 세션은 서버 측에 저장. 서버는 각 클라이언트에 대한 고유한 세션을 유지하고, 세션 데이터는 서버의 메모리나 데이터베이스에 저장.


2. 데이터 저장

  • 쿠키: 쿠키는 작은 데이터 조각으로 제한되며 주로 사용자의 상태 정보나 사용자 설정과 같은 간단한 데이터를 저장합니다.

  • 세션: 세션은 보다 큰 데이터를 저장할 수 있으며, 클라이언트와 서버 간의 상태 정보를 저장하는 데 사용. 로그인 정보, 장바구니 내역, 사용자 프로필 등과 같은 데이터를 저장.


3. 수명

  • 쿠키: 쿠키는 클라이언트 측에서 지정된 만료 날짜까지 영구적으로 저장될 수 있거나, 브라우저가 종료될 때까지 일시적으로 유지.

  • 세션: 세션은 클라이언트가 웹사이트를 떠날 때(일반적으로 브라우저가 종료될 때) 또는 일정 시간이 경과한 후에 만료. 세션은 서버에서 유지되며, 클라이언트와의 연결이 종료될 때 삭제.


4. 보안:

  • 쿠키: 쿠키는 클라이언트 측에 저장되므로 보안에 취약. 민감한 데이터를 저장할 때는 보안 문제에 유의.

  • 세션: 세션은 서버 측에 저장되기 때문에 상대적으로 안전. 민감한 데이터는 서버에 저장되므로 클라이언트에서 직접 액세스할 수 없다.

**세션 ID를 잘못 생성, 관리했을 때 발생할 수 있는 문제점

인증 전과 인증 후 동일한 세션 ID를 유지하는 경우 세션 ID 고정

세션 ID 생성 규칙을 유추할 수 있는 경우 세션 ID 추출

(스크립트 코드를 이용해서) 브라우저에 저장된 세션 ID를 탈취할 수 있는 경우 세션 ID 훔치기 == XSS 공격


5. 사용 용도:

  • 쿠키: 쿠키는 주로 사용자 설정, 사용자 추적, 광고 타겟팅 등과 같은 간단한 작업에 사용.

  • 세션: 세션은 주로 사용자 인증, 상태 관리, 장바구니 관리, 사용자 데이터 저장 등과 같은 중요한 작업에 사용.

profile
https://github.com/John-Jung

0개의 댓글

관련 채용 정보