본문 바로가기
network

쿠키, session, jwt 정리

by 무대포 개발자 2021. 11. 7.
728x90
반응형

HTTP 프로토콜에서 상태를 저장하는 방법

  • HTTP 는 stateless protocol 입니다. 즉, 상태가 없는 프로토콜입니다.
  • 서비스를 이용할 때, 상태가 필요한 순간이 있습니다. (장바구니, 로그인 등)

쿠키

  • 웹브라우저에 cookies 라는 데이터를 저장하여 HTTP 상태를 저장하는 방식입니다.
  • 흐름은 다음가 같습니다.
    1. client --> Server 로 접속
    2. 서버에서 cookies 세팅
    • Set-Cookie: key=value
    • Set-cookie 란 header 에서 쿠키를 저장하는 공간입니다.
    1. 서버에서 응답을 받아 웹브라우저에 저장
    2. client --> server 로 요청 시, header 에 쿠키를 담아 보내기.
    3. server 는 이를 통해 이전에 접근한 사용자라는 것을 알 수 있습니다.
  • 쿠키의 단점으로는 쿠키정보가 브라우저 상에 저장되어 데이터 변조가 일어날 수 있습니다. 그렇기에 개인정보에 민감한 정보는 쿠키 사용을 권장하지 않습니다.

session

  • 서버상에 상태 정보를 저장하는 방식입니다.
  • 흐름은 다음과 같습니다.
    1. client --> server 로 요청이 들어오면 서버는 sessionid 를 생성하고 redis 와 같은 캐시에 session 정보를 저장합니다.
    • redis 와 같은 캐시를 사용하는 이유는 서버를 확장할 시, 다른 서버에 각각 요청이 들어올 수 있기에 redis 를 사용해서 관리합니다.
    1. 서버에서 set-cookie 에 jessionid 에 세션 ID 를 세팅해서 클라이언트로 전송합니다.
    2. 클라이언트는 이를 받아 다음 요청부터 sessionid 를 보내며 서버에서는 이를 인식해서 이전에 접근한 요청이라는 것을 알 수 있습니다.
  • 주의사항으로는 보안을 위해서 session 유지시간 정책을 설정해서 관리해야합니다.

JWT (Json Web Token)

  • Header(Json), Payload(Json), Signature(서명) 형태의 데이터를 Base64 로 인코딩하여 만든 토큰입니다. 주로 인증이나 정보 전달에 사용됩니다.

JWT 구조

  • 3가지로 구성되어있으며, '.' 로 구분합니다.
  • 헤더는 2가지 정보를 저장하고 있습니다.
    • typ : 토큰의 타입
    • alg : 해싱 알고리즘을 뜻하며, 서명 부분에서 사용합니다. ex) SHA, RSA 등
  • 아래와 같은 정보를 base64 로 인코딩하면 header 데이터가 완성됩니다.
{   "typ" : "JWT",   "alg" : "SHA256" }
payload
  • 데이터를 담을 수 있는 구조이며, name/value 방식으로 여러 데이터를 담을 수 있습니다.
서명
  • 헤더의 인코딩 데이터 + payload 의 인코딩 값을 합쳐서 주어진 비밀키로 hashing 하여 생성합니다.

JWT 를 이용한 인증 흐름 예시

  1. client 에서 인증 서버로 접근하면 서버에서 JWT 를 만들어 응답해줍니다.
  2. client 에서는 이를 받아 header 의 Authrization 에 담아 api 를 요청하면 서비스를 제공하는 서버에서 해당 토큰에 대한 유효성을 검증하는 방식입니다.
    • 이 때, 검증은 인증 서버를 호출해서 검증하게 돼있습니다.
  3. 인증을 완료하면 클라이언트에게 응답을 줍니다.

JWT 장점

  • 세션에 비해 확장성을 보장할 수 있습니다. 세션은 서버에 정보를 저장해야합니다. 그렇기에 서버가 늘어날수록 분산 환경에 대한 고려를 해야합니다
  • 서버 기반 인증 시스템은 CORS 문제가 있을 수 있습니다. (ex 세션) 이런 것을 토큰 기반 방식을 통해 해결가능합니다.

JWT 단점

  • 만들어지면 삭제가 불가능하므로 토큰 만료시간이 반드시 필요합니다.
  • 토큰 자체에 정보를 담고 있으므로 주의해야합니다.
  • 정보가 늘어날수록 토큰 자체의 길이가 늘어납니다.

reference

댓글