세션 vs 토큰 JWT란?

·2023년 5월 31일
0

로그인 기능으로 설명

🥝 그림 요약

🥝 배경

  • 그동안 form으로 아이디, 비밀번호를 받자마자 DB에 저장해왔다면, 멈추어야 한다!
  • DB가 유출되면 모든 회원 정보가 유출되는 것이기 때문이다

🥝 기본 지식

🥥 인증(Authentication): 로그인

  • 특정 권한이 주어진 사용자임을 id, pw로 인증 받는 거다
  • => 사용자가 자기 계정을 사용하려고 할때 로그인을 시킴

🥥 인가(Authorization): 인증 유지

  • 내 계정으로'만' 할 수 있는 기능을 이용할때
  • 로그인 되어있음을 알아보고 허가해주는 것이다
  • JWT는 인가에 더 가까운 기술이다
  • => 인증을 받은 사용자가 서비스 안에서 돌아다닐때 서버에서 로그인한 사용자인 것을 알아보고 허가해주는 것

stateless: 시간에 따라 바뀌지 않는 상태값(비밀 키)을 갖는 것 => JWT
stateful: 시간에 따라 바뀌는 상태값(세션 id)을 갖는 것 => 세션

🥝 서버는 어떻게 요청을 받을때마다 사용자의 로그인 여부를 확인할 수 있을까?

🥥 1. 세션 아이디에 저장

(세션 개념은 잡혀있기 때문에 따로 정리하지 않음)

  • 문제점
    • 서버 여러 개를 사용할때
    • 에러 때문에 메모리가 모두 날라가면 세션 정보도 사라짐

🥥 2. JWT(Json Web Token)방식

  • 토큰 방식이란?

    • 사용자가 로그인을 하면 토큰을 생성해서 사용자에게 건네준다
    • 토큰만 주고 서버는 기억하지 않는다
  • 토큰이란?

    • 알파벳, 숫자가 아무렇게 섞인 백 몇십 글자

🥝 JWT

- ex) `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c`
- 인코딩 or 암호화된 3가지 데이터(header, payload, verify signature)를 이어붙인 형태
  - 마침표로 끊어져서 세 부분으로 나뉜다

🥥. 페이로드

(header, payload, verify signature)

  • Base64 디코딩 => JSON

    • 누가 누구에게 발급했는지
    • 토큰이 언제까지 유효한지
    • 서비스가 사용자에게 이 토큰으로 공개하기 원하는 내용
  • Claim: 토큰에 담긴 사용자 정보 등의 데이터

  • 로그인 이후 요청마다 사용자가 서버한테 보내준다

  • 그런데 Base64로만 디코딩이 되어있으면 사용자가 악용할 소지가 있지 않나요? => 헤더와 서명에서 암호화함

🥥. 헤더

(header, payload, verify signature)
담겨있는 정보

  • type(토큰의 타입): 언제나 JWT
  • alg(알고리즘): 3번 서명값을 만드는데 사용될 암호화 알고리즘

🥥. 서명

(header, payload, verify signature)
페이로드와 헤더, '서버에 감춰놓은 비밀 값'을 암호화하면 서명값이 나온다

🥝 프로세스

  1. 요청 시 토큰 값이 서버로 오면
  2. 헤더와 페이로드를 '서버의 비밀 키'로 암호화한 값이
  3. 서명 값과 일치하는지 확인한다
    3-1. 만약 서버가 아닌 다른 곳에서 페이로드가 조금이라도 수정된다면 일치하지 않는다 => 정보 조작한 사용자, 해커로 간주
  4. 서명 값과 일치하고 유효기간도 지나지 않았다면 로그인 된 회원으로 인가를 받는다
  5. 서버는 사용자의 상태를 저장할 필요 없이 들어오는 토큰만 인식하면 된다

🥝 그렇다면 세션보다 JWT가 완전히 우월한가요?

🥥 정답: X

세션을 대체하기에는 JWT에 결점이 있다
세션(stateful)처럼 모든 사용자들의 상태를 기억하고 있다는 건 구현하기 부담되고 고려사항도 많지만,
이것이 되기만 하면 기억하는 대상의 상태들을 언제든 제어할 수 있다는 의미이기 때문이다
=> 세션은 서버에서 관리하기 때문에 필요시 삭제시킬 수 있다
=> 토큰은 이미 줘버렸기 때문에 관리할 수 없다

🥥 이러한 JWT의 단점 보완

  1. 토큰의 유효 기간을 짧게 2개를 준다
  2. access토큰, refresh(1~2주) 토큰 발급
  3. refresh 토큰은 상응값을 DB에도 저장한다
  4. 클라이언트는 access 토큰 수명이 다 하면 refresh 토큰을 보낸다
  5. 서버는 이것을 DB와 비교해서 맞다면 새 access 토큰을 발급해준다

🥝 한줄..두줄... 총정리

JWT는 session과 같은 선상에 있는 token의 한 종류이다
token에는 사용자 정보, 암호화 기법 정보 등이 담겨있고 서버가 아닌 사용자가 가지고 있다
사용자: 로그인한 상태에서만 사용할 수 있는 요청을 할때마다 서버에 token을 전달
서버: 자신만 아는 비밀키로 token을 분석하여 인가를 준다

공부한 유튜브 영상 링크
ㄴ 영상 너무 좋습니다....ㅠㅠ 추천!!!!

profile
기록하고 싶은 내용들을 주로 올리고 있습니다

0개의 댓글