JSON 객체를 기반으로 모바일이나 웹의 사용자 인증을 위해 사용하는 암호화된 토큰이다. JWT
는 사용자 자격, 만료시간, 발급자 등의 정보들을 개방형 표준(RFC 7519)에 따라 암호화한 복잡한 문자열 형태로 되어있다.
기존의 세션 인증 방식은 일반적으로 서버와 데이터베이스를 사용하여 사용자의 인증 정보를 관리한다. 그러다보니, 서비스의 사람이 많아질수록 인증을 담당하는 서버의 부하가 늘어나고 비용이 증가하게 된다.
JWT
의 경우, 사용자에게 토큰을 발급하고 로그인이 필요한 경우, 해당 토큰을 서버에 보내 인증받은 사용자인지를 확인한다. 따로 토큰을 데이터베이스에 저장하거나 상태를 유지하지 않기 때문에 세션 대비 서버 비용이 한층 줄어들게 된다.
각각의 토큰은 헤더, 페이로드, 서명 세 가지 요소로 구성되며, 헤더는 암호화 방식과 토큰의 타입을, 페이로드는 사용자 자격, 만료시간, 발급자 등의 정보를, 서명은 헤더와 페이로드를 인코딩한 값과 개인키를 적용시킨 토큰의 전체 정보가 담긴다.
여러가지 방법이 존재하는데, 가장 많이 본 사례는 아무래도 access-token
과 refresh-token
을 활용하는 것이다. 만료기간이 길고 짧은 두 개의 토큰을 생성하여, 인증과정에서 행여 access-token
이 탈취당하더라도, 시간이 짧기 때문에 문제가 오래 지속되지 않도록 할 수 있다.
access-token
: 만료시간이 비교적 짧은 API를 사용하기 위한 인증용도의 토큰refresh-token
: access-token
을 업데이트 하기 위한 토큰, access-token
이 만료되는 경우, refresh-token
을 통해 인증을 시도.다음 그림은 access-token
과 refresh-token
을 활용한 인증 방식의 예이다.
유저가 첫 로그인을 시도한다.
서버는 access-token
, refresh-token
을 생성하여, 저장하는 작업을 진행한다. (개발자마다 혹은 서비스마다 저장하는 곳이 다를거다.)
인증/인가가 필요한 요청마다, 클라이언트는 access-token
을 보낸다.
서버는 access-token
을 확인하여 다음 작업을 수행한다.
access-token
이 만료되었다면 refresh-token
을 확인한 후 새로운 access-token
을 생성하여 응답과 함께 보낸다.refresh-token
도 만료되었다면, 새로운 refresh-token
을 생성하여 저장 후, 새로운 access-token
을 생성하여 응답과 함께 보낸다.access-token
이 만료되지 않았다면 인증과정을 통과한 후 기존 보내야할 응답을 보낸다.세션의 서버 부하를 개선하기 위해 나타난 JWT
여도 단점은 존재한다.
먼저 stateless
를 통해 나타나는 문제가 있다. 효율적인 인증 방식을 위해 취한 방법이지만 토큰 생성 후 클라인언트에게 보내게 되면, 서버는 이후 할 수 있는 것이 없다. 즉 필요한 경우 클라이언트에서 다시 인증 요청을 하기 전까지는 서버는 제어권을 가질 수 없다는 것이다. 보안이 중요한 서비스의 경우, 이중 로그인이 불가능하게 설정하는 곳이 많다. 예를 들어 모바일로 접속했다가 PC로 접속하는 경우 모바일의 로그인을 해제하거나 가지고 있는 토큰을 강제 만료시키는 경우가 있겠다. 이런 서비스에 있어서는 JWT는 좋은 선택이라고 볼 수 없다.
또한 JWT
는 개인키를 다루기 때문에 암호화 방식 잘못 고르거나, 개인키를 지속적으로 그대로 유지하거나, access-token
에 대한 보안처리를 하지 않는다면, 인증 과정에서 문제가 나타나기 쉽다. 이러한 문제를 보완하는 방법도 존재하긴 하나, 서버에 저장하기에는 세션과 유사해져서 비용적인 문제가 발생할터이고, 쿠키에 저장하기에는 오버헤드가 발생할 수 있다는 단점이 생긴다. 그리고 이 방법들이 생각보다 구현 난이도가 높다.
기존 세션 방식 대비 적은 비용으로 효율적인 보안 인증을 할 수 있다는 점에서는 충분히 좋은 인증 방법이라 할 수 있다.
단, 비용을 줄이고 효율성을 택한 대신 나타나는 취약성도 존재하며, 이러한 취약성을 보완하는 추가 작업들은 구현 난이도가 높고, 단점을 완벽하게 처리하였다고 보기 어렵기 때문에 시간이 지날수록 고민이 많아지는 인증 방식이라 할 수 있다.
특히 뱅킹과 같이 보안이 중요한 서비스 이거나 대규모 사용자의 서비스이며 특히 마이크로 서비스를 채택하는 경우에는 결국 어느정도의 서버 비용을 확보 해야하기 때문에, 비용을 더 들여서라도 안전한 세션을 추구하는 것이 보다 알맞은 선택일 수 있다.
참고
JWT란 무엇인가? 그리고 어떻게 사용하는가? (2) - 사용처
JWT의 단점과 주의사항
JWT란 무엇인가
[WEB] 📚 JWT 토큰 인증 이란? - 💯 이해하기 쉽게 정리
JWT 대충 쓰면 님들 코딩인생 끝남
JWT (JSON Web Token) 간단히 훑어보기