JWT란?
JWT(Json Web Token) 은 웹에서 사용되는 JSON 형식의 토큰에 대한 표준 규격
사용자의 인증, 인가 정보를 주고 받기 위해 사용한다.
주로 Authorization 헤더에 Bearer + token 형태로 사용된다.
Base64로 표현 되어 있고 인코딩, 디코딩이 쉽다.
Base64란?
64진법 이라는 뜻.
8비트 이진 데이터를 ASCII 영역의 문자로 바꾸는 인코딩 방식.
구성 방식
토큰의 구조는 다음과 같다.
- Header : 토큰의 타입이나 어떤 알고리즘으로 생성되었는지 저장한다.
- Payload : 사용자, 토큰에 대한 정보를 저장한다. (표준은 키를 3글자로 지정한다.)
- Signature : Header와 Payload 값을 서버에 있는 개인 키를 활용해 암호화해 저장한다. (위, 변조 방지용)
작동 방식
- 최초 로그인 시 서버에서 토큰을 사용자에게 발급
- 사용자는 다음 요청부터 Authorization 헤더에 발급받은 토큰을 넣어 요청을 보냄
- 서버는 해당 토큰을 검증(사용자 정보, 권한, 만료기간 등)을 확인하여 토큰이 유효하면 접근을 허가함
왜 사용하는가?
세션&쿠키 방식은 이용자가 늘어나면 메모리 사용량이 그만큼 늘어나게 되며,
매 요청마다 세션 저장소를 조회해야한다는 단점이 있었다.
JWT는 토큰 자체에 사용자 정보를 저장한다.
따라서 서버는 요청이 들어오면 토큰을 확인하는 로직만 수행하면 되므로
이용자가 늘어나도 session 방식과 다르게 서버에 부하가 적다.
그러나 단점도 존재하는데
- 쿠키&세션 방식보다 데이터 전달량이 많다
- Payload는 암호화되어있지 않으므로, 디코딩이 매우 쉽다.
- 발급한 토큰을 서버에서 관리할 수 없으므로 토큰 탈취시 대처가 어렵다.
따라서 토큰 생성시 민감한 정보는 절대로 넣으면 안되며
Secure, Http Only 등의 설정 잘 해줘야한다.
또한 발급한 토큰은 더 이상 서버에서 관리 못한다는 단점 때문에 로그아웃, 접근 제한 등이 어렵다.
이러한 문제를 해결하기 위해
- 블랙리스트 방식
- 리프레쉬 토큰 방식
을 주로 사용한다.
블랙리스트 방식
db, 혹은 서버 메모리에 허용하지 않을 토큰 명단을 생성후
해당 토큰이 들어오면 허가를 하지 않는 방식.
그러나 JWT의 장점인 stateless 하다, 서버 자원 사용이 적다는 장점이 사라지게 된다.
리프레쉬 토큰 방식
토큰의 탈취 가능성을 생각해 토큰의 유효기간을 매우 짧게 설정한 후 (엑세스 토큰)
유효기간이 긴 리프레쉬 토큰을 같이 발급해, 리프레쉬 토큰이 유효할 경우 토큰을 재발급 하는 방식.
리프레쉬 토큰은 발급 후 redis 같은 곳에 저장해서 관리한다.
(리프레쉬 토큰이 탈취당했을 경우 db에서 삭제 등으로 대응 가능)
액세스 토큰이 들어올 경우 확인만 하면 되므로 기존 JWT 장점 살리며
토큰이 탈취돼어도 길게 사용하지 못하도록 해 보안성을 높인다.
리프레쉬 토큰을 저장하고 사용하면 세션방식과 다를게 뭔가? 라는 생각이 들었지만
세션 방식은 매 요청마다 저장소를 확인하지만, 리프레쉬 토큰은 액세스 토큰이 만료되었을때만 확인하면 된다.
보통은 리프레쉬 토큰 방식을 사용하여 관리하며
보안이 중요한 경우 블랙리스트 방식을 같이 사용한다.
JWT 방식을 반드시 사용해야할까?
공부하면서 느낀점은 사실 JWT를 사용할 필요가 있을까 싶다.
요청이 몰리는 경우가 많은 서비스 등의 경우가 아닌 이상
그냥 세션 방식 써도 될 것 같다.
기존 세션 방식의 문제점인 서버 자원 사용량 증가 등의 문제는
Redis를 이용한 세션 클러스터링등으로 해결이 가능해진 것 같다.
은탄환은 없다라는 유명한 말이 있다.
상황에 맞춰서 적절한 방식을 사용하자.
Spring Security를 사용해 JWT 방식을 적용한 코드는 다음 글에서 써보겠다.
'Spring > Spring Security' 카테고리의 다른 글
사지방에서 Spring Security 공부하기 #6 - OAuth2 + JWT를 이용한 인증, 인가 구현 (2) | 2024.01.02 |
---|---|
사지방에서 Spring Security 공부하기 #5 - OAuth2 + Session을 이용한 인증, 인가 구현 (4) | 2023.12.29 |
사지방에서 Spring 공부하기 Spring Security #4 - JWT를 이용한 인증 인가 적용 코드 (0) | 2023.10.19 |
사지방에서 Spring 공부하기 - 기존 프로젝트에 Spring Security 적용기 (0) | 2023.09.27 |
사지방에서 Spring 공부하기 - Spring Security란? (3) | 2023.09.26 |