JWT 사용기

Posted by 엘키의 주절 주절 on September 26, 2018

JWT란 Json Web Token으로써, JSON으로 이루어진 데이터를 token화 한 것을 말한다.

JWT의 특징은 여럿이 있는데, 정보를 token 내에 보유하고 있는 (self contained) 독특한 토큰이다.

만료 시간은 부여할 수 있으나 강제 만료는 불가능하다. JWT를 이용한 강제 만료를 구현하기 위해선 이를 검증하는 저장소를 한번 거쳐야 되는 이슈가 있는데, 매번 키 검사를 해야 하는 구조라면 신경 쓰일 수 밖에 없는 요소라고 할 수 있다. (결합도도 증가 하는 단점도 덤이다.)

즉 탈취되도 문제가 적은 AccessToken으로써 기간 만큼만 유효성을 유지시키고, 서명을 통한 발급 정보 크로스 체크, 해쉬 검사에 쓸 값도 같이 담아서 받아 재확인 함으로써 유효하다는 것을 검증하는 구조로 사용 할 만 하다.

부가정보를 다양하게 담을 수 있으므로, 확실히 검증 된 결과를 바탕으로 여러가지 정보 값을 체크 하는 용도로 쓸 수 있으므로, DB 조회량을 감소 시키는 효과를 볼 수 있다.

또한 토큰 발급과, 정보 값을 검증하는 로직을 서버에만 둔다면 (secret 키를 사용자에게 감췄다면), 결합도를 낮추고 서버의 접근 권한을 검사/허용하는 용도로 쓸 수도 있다.

json_web_tokens

참고 : https://auth0.com/learn/json-web-tokens/

너무 중요해서 다시 한번 강조하자면, 보안적 핵심은 secret은 Server만 안다는 점이다.

아래와 같이 Authorization Server에서 발급한 정보를 바탕으로 특정 Resource Server로 질의할 수 있다는 점인데, 이 과정에서의 결합도도 낮아지며, 보안 취약점도 없다는 점이 매우 중요하다.

jwt_client-credentials-grant

참고 : http://jwt.io

JWT가 아니었다면 아래와 같았을 것이다. JWT이기에 위와 같은 과정만으로 접근 허가를 확인 받을 수 있다.

jwt_before

많이 강조되는 점은 아니지만, 성능상으로도 충분히 합리적이다. 생성 자체는 가볍다지만, 정보를 다시 조회하기 위해서 DB 종속성을 갖게 되는 일반 토큰과 달리 정해진 규칙대로 풀고 확인하면 되기 때문이다.


참고 링크

Java-JWT

Angular-JWT

JWT