JWT (Json Web Token)
웹에서 사용되는 JSON 형식의 토큰에 대한 표준 규격.
주로 사용자의 인증(authentication) 또는 인가(authorization) 정보를 서버와 클라이언트 간에 안전하게 주고 받기 위해서 사용된다.
※ 인증(authentication)
: 사용자의 신원을 검증하는 행위.
ex) 비밀번호, 생체인식
※ 인가(authorization)
: 사용자에게 특정 리소스나 기능에 액세스할 수 있는 권한을 부여하는 프로세스.
ex) 서버에서 특정 파일을 다운로드할 수 있는 권한 부여,
애플리케이션에 액세스할 수 있는 권한 부여
JWT 토큰 웹에서 보통 Authorization HTTP 헤더를 Bearer <토큰>으로 설정하여 클라이언트에서 서버로 전송되며, 서버에서는 토큰에 포함되어 있는 서명(signature) 정보를 통해서 위변조 여부를 빠르게 검증할 수 있다.
같은 Token 인증방식이지만 OAuth와 달리 아무 의미없는 문자열로 된 토큰이 아니라 토큰 자체가 의미를 갖는 *Claim 기반의 토큰 방식이다.
* Claim( 권한 ) : 사용자에 대한 프로퍼티나 속성
정보가 담긴 데이터( JSON 객체 )를 암호화 하여, HTTP 헤더에 추가 시키는 방식으로 권한을 부여하기 위해 필요한 데이터가 JWT안에 모두 담겨다.
OAuth 처럼 인증 서버에서 토큰에 대한 정보를 찾을 필요가 없다.
Access Token & Refresh Token 인증 방식
: 기본 JWT 방식의 인증(보안) 강화 방식
Access Token은 발급된 이후 서버에 저장되지 않고 토큰 자체로 검증을 하며 사용자 권한을 인증한다. 따라서 Access Token이 탈취되면 토큰이 만료되기 전까지 토큰을 획득한 사람은 누구나 권한 접근이 가능해지기 때문에 제3자에게 탈취당할 경우 보안에 취약하다.
JWT는 발급한 후 삭제가 불가능하기 때문에 접근에 관여하는 토큰에 유효시간을 부여하는 식으로 탈취 문제에 대해 대응을 하여야 한다.
이처럼 토큰 유효기간을 짧게하면 토큰 남용을 방지하는 것이 해결책이 될 수 있지만, 유효기간이 짧은 Token의 경우 그만큼 사용자는 로그인을 자주 해서 새롭게 Token을 발급받아야 하므로 불편하다는 단점이 있다. 그렇다고 무턱대고 유효기간을 늘리는 경우 토큰을 탈취당했을 때 보안에 더 취약해지게 된다.
이를 보완하기 위해 Refresh Token이 만들어지게 되었다.
서버는 로그인을 성공시키면서 클라이언트에게 Access Token과 Refresh Token을 동시에 발급한다.
→ 서버는 데이터베이스에 Refresh Token을 저장하고, 클라이언트는 Access Token과 Refresh Token을 쿠키, 세션 혹은 웹스토리지에 저장하고 요청이 있을때마다 이 둘을 헤더에 담아서 보낸다.
이 Refresh Token은 긴 유효기간을 가지면서, Access Token이 만료됐을 때 새로 재발급해주는 열쇠가 된다. 따라서 만일 만료된 Access Token을 서버에 보내면, 서버는 같이 보내진 Refresh Token을 DB에 있는 것과 비교해서 일치하면 다시 Access Token을 재발급하는 간단한 원리이다. 그리고 사용자가 로그아웃을 하면 저장소에서 Refresh Token을 삭제하여 사용이 불가능하도록 하고 새로 로그인하면 서버에서 다시 재발급해서 DB에 저장한다.