유튜브 코딩애플님의 영상을 보았다. JWT 토큰을 간단하게 사용해본 적은 있지만 코딩인생을 끝내고 싶지 않았기 때문에 영상 내용을 간단히 정리해보려 한다.
보통 회원 기능을 구현하는 방식에는 2가지가 있다.
- 세션 방식
- 토큰 방식
유저가 로그인을 하면 서버에서 입장권을 발급해주고, 서버에 요청할 때마다 입장권을 제출하면 서버에서 입장권을 확인 후 응답을 해주는 것이 일반적인 과정이다.
세션 방식
세션 방식을 사용하면 입장권에 써있는 정보가 많이 없다. 발급 번호 정도만 존재하고, 서버에서는 해당 번호가 서버에 존재하는지 확인 후 통과시킨다.
JWT 방식
입장권에 써있는 정보가 많다. 이메일, 이름, 발급일, 유효기간 등. 입장권을 검사할 때 입장권 자체만 검사하면 된다. 그렇기 때문에 회원이 많아질 수록 서버에 부담이 덜해진다.
주의할 점
1. alg: none 공격
HEADER에 alg: none으로 놓고 토큰을 만들면 안된다. 가끔 alg: none으로 요청을 보낼 시에 입장이 되는 서버가 있다. none으로 만든 jwt를 거절하는 기능도 있는지 잘 확인해봐야 한다. (최신 라이브러리들을 잘 쓰면 크게 걱정은 안 해도 된다.)
2. JWT는 변환이 쉽다
JWT는 변환이 쉽기 때문에 민감한 유저정보를 모두 넣으면 안되고, 최소한의 정보만 다뤄야 한다.
3. 시크릿키 문제
생각보다 시크릿키를 대충 적는 사람이 많다. 강의나 글에서 secret으로 지정했다고 그대로 지정하지 말자. 대충 적으면 때려맞추기 쉽다.
키를 매우 길게 설정하고 키를 safe하게 관리해줘야 한다. 또는 키를 하나만 사용하지 않고 생성용 키/검증용 키를 생성해서 운영해도 된다.
4. JWT 탈취
토큰을 사용정지시키거나 할 수 없기 때문에 유효기간이 끝나기 전까지는 계속 쓸 수 있다.
솔루션 1. jwt 유효기간을 짧게
jwt의 유효기간을 짧게하면 시간이 지나면 못쓰게 되니까 좀 더 안전해진다. 이렇게 하려면 재발급을 위한 refresh token을 따로 운영해야 한다.
솔루션 2. refresh token rotation
refresh token 역시 탈취당할 수 있다. 따라서 refresh token rotation이라는 방식을 사용해주는 게 더 안전하다.
'TIL' 카테고리의 다른 글
[TIL] 23.01.10 프리온보딩 챌린지를 시작하며 (0) | 2023.01.11 |
---|---|
[TIL] 22.12.30 타입스크립트 핸드북 - Everyday Types (0) | 2022.12.31 |
[TIL] 22.12.23 HTTP 헤더 - 캐시와 조건부 요청(2) (0) | 2022.12.23 |
[TIL] 22.12.21 HTTP 헤더 - 캐시와 조건부 요청(1) (0) | 2022.12.22 |
[TIL] 22.12.18 HTTP 헤더 - 일반 헤더(2) (0) | 2022.12.19 |