230621 쿠키, 세션, JWT

보트·2023년 6월 21일
0

Spring

목록 보기
5/27
  • HTTP에 상태 정보를 유지(stateful)하기 위해 사용됨

  • <key, value> 형태의 문자열로 클라이언트(브라우저)에 저장될 목적으로 생성됨
    -> 서버가 클라이언트 별로 인증, 인가를 할 수 있음
    -> 한 번 로그인을 하면 쿠키를 생성해 저장하고 이후 요청은 로그인 없이 진행할 수 있도록 함

  • 구성요소
    name(key), value, domain, path, expires

  • cookie에 id, pw와 같은 중요 정보들을 담는 것이 아니라 인증을 위한 별개의 정보를 세션 저장소에 저장하고
  • 클라이언트는 이 정보를 쿠키에 담아 요청하고 서버는 세션 저장소에 있는 정보와 일치하는지 확인

문제점

  • 서버는 클라이언트의 상태를 저장하지 않아야 하지만(stateless) 세션 저장소에서 클라이언트의 상태를 저장하게 되므로 stateful하게 된다

JWT

  • 두 개체에서 JSON 객체를 사용하여 가볍고 자가수용적인(self-contained) 방식으로 정보를 안전하게 전달
    (self-contained : JWT 안에 인증에 필요한 모든 정보를 자체적으로 지니고 있다)
  • 로그인 정보를 서버에 저장하지 않고, 클라이언트에 로그인 정보를 JWT로 암호화하여 저장
  • 모든 서버에서 동일한 secret key 소유
  • jwt를 cookie에 저장해 전달하는 방법
    : jwt가 아닌 cookie에 만료기한, 기타 다른 옵션 등을 줄 수 있음
    : header에 set-cookie로 자동 저장
  • response header에 바로 넣어서 반환하는 방법
    : cookie를 만들 필요가 없어 코드가 줄어듦

장점

  • 동시 접속자가 많을 때 서버 측 부하 낮춤
  • 클라이언트와 서버가 서로 다른 도메인을 사용할 때 (카카오 OAuth2 로그인 시 JWT Token 사용)

단점

  • 구현이 복잡함
  • JWT에 담는 내용이 커질 수록 네트워크 비용 증가 (클 -> 서)
  • secret key 유출 시 JWT 조작 가능

  • JWT 구조 : header(헤더).payload(바디).signature(서명)
  • 헤더 : typ(토큰의 타입), alg(해싱 알고리즘)
  • 바디 : 토큰에 담을 정보 존재, 정보의 한 조각을 claim이라고 함, 중요 정보를 담으면 안 됨
  • 서명 : 토큰을 인코딩하거나 유효성 검증을 할 때 사용하는 암호화 코드

(참고 : https://velog.io/@znftm97/JWT-Session-Cookie-%EB%B9%84%EA%B5%90-sphsi9yh)

profile
일주일에 한 번

0개의 댓글