[짧은 CS] 쿠키, 세션, jwt

HyunDong Lee·2022년 6월 21일
0

짧은CS

목록 보기
6/6
post-thumbnail

인증의 필요성

http 프로토콜은 비연결성, 무상태성 프로토콜이다.

  • http 프로토콜은 비연결성이기 때문에 request에 response를 보내면 연결이 끊어진다.
  • http 프로토콜은 무상태성 이기 때문에 request, response를 주고 받으면 상태정보를 유지하지 않은 채 통신이 끝나게 된다.

인증의 필요성

http는 서버가 다수의 클라이언트와 연결을 계속 유지하지 않기 때문에 불필요한 자원 낭비를 줄일수 있지만 동시에 서버가 클라이언트를 식별할 수 없다.

만약 클라이언트가 로그인을 하더라도 다음 요청시 해당 클라이언트의 인증 정보를 기억하지 못한다면 다시 로그인해야하는 문제가 발생한다.

→ 클라이언트는 매번 요청할 때마다 서버는 새로운 사용자로 인식하기 때문에 인증절차가 중복되는 문제가 있다.

http의 무상태성으로 인해 인증절차가 중복되는 문제가 발생한다. 이 문제는 쿠키, 세션, 토큰 을 통해 인증정보를 유지하여 해결할 수 있다.

쿠키

key-value형태의 문자열이고 클라이언트 측에 저장된다.

쿠키의 속성

  • value 쿠키값
  • domain - 쿠키에 접근 가능한 도메인을 설정하는 속성이다.
  • path - 쿠키에 접근할 수 있는 경로를 설정하는 속성이다.
  • expires - 쿠키를 얼마나 유지할 것인지 설정하는 속성이다.

쿠키의 동작방식

  1. 웹브라우저가 서버에 req
  2. 서버는 상태 유지를 하려는 값을 쿠키로 생성하고, 이를 resp의 http헤더 set-cookie에 포함하여 전송
  3. 웹 브라우저는 전달받은 쿠킬르 받아 저장하고, 다음 req를 전송할 때 http 헤더 cookie에 담아서 전송한다.

쿠키의 문제점

  • 쿠키에 대한 정보를 매 헤더에 추가하여 보내기 때문에 상당한 트래픽을 발생시킨다.
  • 보안에 취약하다
  • 쿠키의 개수, 크기가 한정되어 있다.
  • 웹 브라우저 변경시 다른 웹브라우저에서 저장한 쿠키값을 사용할 수 없다.

세션

세션은 쿠키의 문제점을 해결하기 위해 등장, 일정 시간동안 같은 웹브라우저로부터 들어오는 일련의 요구를 하나의 상태로 보고 그 상태를 일정하게 유지시킨다. 서버측에 저장한다. object 형태

세션 + 쿠키 기반 인증 → 서버 기반 인증

  1. 클라이언트는 로그인 정보를 서버에게 전달한다.
  2. 서버는 db를 통해 로그인 정보를 검증하고, 검증이 되면 사용자를 식별할 고유 sessionID를 생성한다. 이후 http resp 헤더의 set-cookie 필드에 sessionID를 담아 클라이언트에게 전달한다.
  3. 클라이언트는 전달받은 sessionID를 쿠키에 저장하고, 요청 시 http req 헤더의 cookie필드에 쿠키를 담아 서버에 전달한다.
  4. 서버는 쿠키를 받아 세션 저장소를 통해 sessionID의 유효성을 확인한 이후, 요청을 처리한다.

서버 기반 인증 시스템의 문제점

  1. 서버 부하 문제
  2. 확장성 문제
  3. CORS 방식

토큰 기반 인증(jwt)

토큰 기반 인증시스템은 인증받은 사용자들에게 토큰을 발급하고, 서버에 요청할 때마다 헤더에 토큰을 담아 보내도록하여 유효성 검사를 한다

서버 기반 인증과 달리 상태정보를 유지하지 않으므로 stateless한 구조를 가진다

토큰 기반 인증 과정

  1. 클라이언트가 로그인 정보를 서버에게 전달
  2. 서버는 로그인을 검정하고 정확하다면 사용자 식별 정보를 기반으로 token을 발급한다. 그리고 이를 클라이언트에게 전달한다.
  3. 클라이언트는 전달 받은 token을 쿠키나 local, sessionStorage 등에 저장하고, 이후 요청시에 token을 담아 전달한다
  4. 서버는 클라이언트로부터 받은 token을 검증하고 요청을 처리한다.

jwt 구성

aaaaaa.bbbbb.ccccc

header . payload . signature

  • header
    • jwt의 토큰의 타입과 사용되는 해시 알고리즘 정보
  • payload
    • 클라이언트 정보
  • signature
    • 서명은 header와 signature를 더한 뒤 secret key로 해싱하여 생성한다.

0개의 댓글