본문 바로가기

웹 모의해킹 스터디/수업 정리

쿠키 vs 세션 vs 토큰(JWT) | 서버가 로그인 상태를 유지하는 방법

우리가 웹사이트에 로그인을 하면 카페나 블로그로 이동해도 로그인 상태는 유지되어 있다. 다른 페이지로 이동하더라도 로그인이 풀리지 않아 굳이 다시 인증할 필요가 없다는 것이다. 그렇다면 서버는 어떻게 새로운 요청을 해도 인증 상태를 유지하는걸까?

 

우선 웹 표준 프로토콜인 HTTP의 특징을 알아보자.

HTTP의 특징:

  1. Stateless:  서버는 클라이언트의 상태를 저장하지 않는다. 따라서 이전에 클라이언트가 어떤 요청을 보냈는지 기억하지 못한다.
  2. Connectionless: 서버는 하나의 요청에 하나의 응답을 보내고 연결을 끊는다. 

두가지 특징을 통해 서버는 비용과 부담을 줄일 수 있다.

 

하지만 서버는 클라이언트의 상태를 저장하지 않기 때문에 사용자가 로그인을 통해 인증을 거쳐도, 이후 요청에 대해서는 인증된 상태를 유지할 수 없다. 그러므로 클라이언트는 최초 로그인 후 요청을 보낼 때마다 id, pw를 같이 보내서 인증된 사용자라는 것을 알려야 한다.

 

서버가 클라이언트 인증을 확인하는 방식은 쿠키, 세션, 토큰 3가지 방식이 있다.


 

> 쿠키

클라이언트(브라우저)에 저장되는 Key-Value가 들어있는 작은 데이터 파일

 

클라이언트 측에 저장된다는 것이 세션과 구분되는 가장 큰 특징이다.

 

쿠키를 이용한 인증 절차

  1. 클라이언트가 로그인을 하면, 서버는 ID, PW 정보를 쿠키에 담아 브라우저로 보낸다.
  2. 브라우저는 서버에서 받은 쿠키를 저장해두었다가, 동일 서버로 재요청 시 쿠키와 함께 전송한다.
  3. 서버는 쿠키에 담긴 정보를 바탕으로 클라이언트가 누군지 식별한다.

장점

  • 서버는 인증을 위한 추가적인 데이터 저장이 필요 없다.

단점

  • 쿠키가 노출되면 id, pw 등 민감정보가 온전히 드러난다.
  • 공격자도 결국엔 클라이언트 측에 존재하므로 쿠키의 데이터 값을 임의로 변경할 수 있다.
  • 서버는 조작된 데이터가 넘어와도 이를 필터링할 수 없다.

 

> 세션

위와 같은 쿠키의 보안적인 이슈 때문에, 세션은 pw 등 클라이언트의 인증정보를 서버 측에 저장하고 관리한다.

 

세션을 이용한 인증 절차

  1. 사용자가 로그인하면 세션이 서버의 메모리(세션 저장소)에 저장된다. (이때, 세션을 식별하기 위한 session id를 기준으로 정보를 저장한다.)
  2. 서버에서 브라우저에 쿠키에 session id를 저장하고, 동일 서버로 재요청 시 session id가 담긴 쿠키를 함께 전송한다
  3. 서버는 클라이언트가 보낸 session id를 통해 세션 저장소의 데이터를 확인하여 클라이언트가 누구인지 식별한다.

장점

  • 클라이언트의 로그인 정보가 서버측에 저장되므로 보안성이 높다.

단점

  • 사용자를 식별할 수 있는 값인 세션 ID를 생성하고, 서버에 저장해야하는 작업이 생긴다.
  • 서버에서 세션 저장소를 사용하므로 요청이 많아지면 서버에 부하가 심해진다.

 

> JWT (JSON Web Token)

토큰 인증이란?

토큰 기반 인증은 클라이언트가 로그인하여 인증되면 서버에서 해당 클라이언트에게 토큰을 부여한다. 이 토큰은 유일하며 토큰을 발급받은 클라이언트는 동일한 서버에 요청을 보낼 때 토큰을 함께 보낸다. 요청을 받은 서버에서는 클라이언트로부터 받은 토큰을 서버에서 제공한 토큰과의 일치 여부를 확인하여 인증 과정을 처리한다.

 

JWT(JSON Web Token)란 인증에 필요한 정보들을 암호화시킨 JSON 토큰을 의미한다.

 

 


jwt 구조와 인증 방식이 추후 추가하겠습니당,,ㅎㅎ