JWT란 Json Web Token의 약자입니다.
어려운 말로 정리하자면, 전자 서명된 URL-safe (URL로 이용할 수있는 문자 만 구성된)의 JSON 형식으로 인증에 필요한 정보들을 암호화시킨 토큰을 의미합니다. 무슨 말일까요?
우선 왜 JWT가 사용되는지 등장배경부터 알아보도록 하겠습니다.
JWT는 세션인증의 단점을 보완하고자 등장하게 되었습니다.
기존의 인증 시스템에서는 서버에서 유저들의 정보를 기억하고 있어야 했습니다. 하지만 이 방법은 웹과 모바일의 사용자가 늘어날수록 서버에 저장하는 데이터 양이 많아지고, 인터넷 통신 속도가 빨라지면서 서버 과부화와 성능저하를 야기했습니다. 이를 위해 , Scale out을 했지만 세션불일치 이슈와 같은 또다른 문제점들이 발생했습니다.또한 모든 데이터를 매번 서버에서 받아오는 것이 속도적으로 느리다는 문제들도 발생했습니다.
그래서 ‘서버에서 유저들의 정보를 관리해서 발생하는 문제들이니까 서버에서 관리하지 않게 하는 방법이 없을까?’ 해서 JWT가 등장하게 된것입니다. 즉, Token 기반 인증 방식의 JWT는 유저들의 관리를 서버에서 직접 관리하지 않고 클라이언트에서 유저들의 정보를 관리하도록 한 것입니다.
하지만 클라이언트에서 유저들의 정보를 저장하게 된다면, 클라이언트 마음대로 정보가 수정되거나 삭제되는 일도 발생하게 됩니다. JWT는 이를 유저가 자신의 데이터를 볼 수 있지만 수정은 하지 못하는(read-Only) 방법으로 해결했습니다. 그리고 데이터를 수정하려고 한다면 무조건 서버
를 통해서만 가능하도록 하였습니다. 즉, 클라이언트의 정보는 클라이언트가 가지고 있되 맘대로 조작할 수 없고, 서버에서는 토큰 유효 확인하여 토큰이 유효할 때만 조작할 수 있게 하는 것입니다.
💡 정리
- 세션에서는 세션 ID만 서버에 전달하면 된다. 세션에 대한 모든 정보와 유저의 정보가 세션 DB에 저장되어 있다.
→ 인증을 위해 세션의 DB 필요- JWT는 유저를 인증하는데 필요한 정보(유저정보)를 토큰에 저장하여 사용자에게 전달하고 서버에서는 해당 토큰이 유효한지 검사한다.
→ 인증을 위해 암호화
JWT의 구조는 (Header).(Payload).(Signature)로 구성되어 있습니다.
서버를 대신해서 클라이언트가 로그인한 사용자의 상태 정보를 기억하는 것이기 때문에, 토큰 자체에 로그인한 사용자의 상태 정보가 담겨 있습니다. 따라서 상대적으로 서버보다 보안이 튼튼하지 못한 클라이언트에서 토큰이 탈취당하면 몇몇 개인정보까지 탈취당할 위험이 있습니다.
더군다나, 세션 기반 인증과 달리 서버는 이미 한 번 발급한 토큰을 무효화시킬 방법이 없기 때문에 탈취된 토큰은 그 유효 기한이 지나기 전까지 마음껏 사용할 수 있다는 단점을 가졌습니다.