JWT란 Json Web Token으로써, JSON으로 이루어진 데이터를 token화 한 것을 말한다.
JWT의 특징은 여럿이 있는데, 정보를 token 내에 보유하고 있는 (self contained) 독특한 토큰이다.
만료 시간은 부여할 수 있으나 강제 만료는 불가능하다. JWT를 이용한 강제 만료를 구현하기 위해선 이를 검증하는 저장소를 한번 거쳐야 되는 이슈가 있는데, 매번 키 검사를 해야 하는 구조라면 신경 쓰일 수 밖에 없는 요소라고 할 수 있다. (결합도도 증가 하는 단점도 덤이다.)
즉 탈취되도 문제가 적은 AccessToken으로써 기간 만큼만 유효성을 유지시키고, 서명을 통한 발급 정보 크로스 체크, 해쉬 검사에 쓸 값도 같이 담아서 받아 재확인 함으로써 유효하다는 것을 검증하는 구조로 사용 할 만 하다.
부가정보를 다양하게 담을 수 있으므로, 확실히 검증 된 결과를 바탕으로 여러가지 정보 값을 체크 하는 용도로 쓸 수 있으므로, DB 조회량을 감소 시키는 효과를 볼 수 있다.
또한 토큰 발급과, 정보 값을 검증하는 로직을 서버에만 둔다면 (secret 키를 사용자에게 감췄다면), 결합도를 낮추고 서버의 접근 권한을 검사/허용하는 용도로 쓸 수도 있다.
참고 : https://auth0.com/learn/json-web-tokens/
너무 중요해서 다시 한번 강조하자면, 보안적 핵심은 secret은 Server만 안다는 점이다.
아래와 같이 Authorization Server에서 발급한 정보를 바탕으로 특정 Resource Server로 질의할 수 있다는 점인데, 이 과정에서의 결합도도 낮아지며, 보안 취약점도 없다는 점이 매우 중요하다.
참고 : http://jwt.io
JWT가 아니었다면 아래와 같았을 것이다. JWT이기에 위와 같은 과정만으로 접근 허가를 확인 받을 수 있다.
많이 강조되는 점은 아니지만, 성능상으로도 충분히 합리적이다. 생성 자체는 가볍다지만, 정보를 다시 조회하기 위해서 DB 종속성을 갖게 되는 일반 토큰과 달리 정해진 규칙대로 풀고 확인하면 되기 때문이다.
참고 링크
Java-JWT
- github
- 사용법
Angular-JWT
JWT
- JWT 소개 및 구조
- 토큰 기반 인증
- JWT를 구현하면서 마주치게 되는 고민들
- JSON Web Toekn (JWT)란 무엇인가?
- JWT를 이용한 모바일 인증