JWT 에 대한 이해를 다시하기 위해 재정리
JWT 구성
다음과 같이 세 부분으로 구성되며, 아래 그림의 정보들이 위 그림처럼 . 을 기준으로 나뉘어 구성된다.
url 인코딩은 안전한 base64 인코딩을 사용한다.
•
header
토큰의 타입 + 서명에 사용할 알고리즘 정보로 구성되어 있다.
•
payload
필요한 정보들을 담는 부분이다. 그러나 jwt는 복호화가 쉽기 때문에 민감한 정보들은 담지 않는 것이 좋다.
위 그림처럼 하나의 key-value 쌍을 한 claim이라고 하며 구성은 커스텀 가능하며 보통 사용되는 claim은
다음과 같다.
•
Issuer (jwt 발행자)
•
Subject (jwt 제목)
•
Audience (jwt가 의도된 수신자)
•
Expiration time (만료 시간)
•
Issued at (발행 시간)
•
signature
jwt의 가장 핵심 부분이다. 헤더와 payload를 . 을 구분자로 합쳐서 헤더에 명시된 암호화 알고리즘으로 private key를 이용하여 암호화 한다.
동작 원리
클라이언트가 처음 로그인 시 서버에서 로그인 정보를 확인하면 JWT 토큰을 발행해준다.
이후 클라이언트는 요청을 보낼 때 헤더에 jwt 토큰을 함께 보냄으로써 서버로부터 인증 받는다.
jwt token은 중간에 탈취당할 가능성이 있기 때문에 주고 받는 토큰(Access Token)은 만료 시간을 짧게 해주는 것이 좋다. 또한 서버는 처음 로그인한 유저에게 토큰을 발행해줄 때 Access Token 외에 만료 시간이 긴 Refresh Token도 같이 발행하여 이를 서버에 저장한다.
이후 Access Token이 만료되면 서버에 있는 Refresh Token을 이용해 새로운 Access Token을 발행한다.
기존 방식과의 차이점
기존에는 세션에 사용자 정보를 저장하고 요청이 들어오면 세션을 찾아서 클라이언트를 인증하는 방식이다.
그러나 jwt 방식은 클라이언트가 인증 수단(토큰)을 관리한다.
Spring Security + JWT 동작 원리
1.
클라이언트에서 서버로 ID/PW로 로그인을 요청한다.
2.
서버에서 검증 과정을 거쳐 해당 유저가 존재하면, Access Token + Refresh Token 을 발급한다.
3.
클라이언트는 요청 헤더에 2번에서 발급받은 Access Token 을 포함하여 API를 요청한다.
여기에서 Access Token과 Refresh Token은 웹 ・ 앱 어플리케이션에서 인증 및 권한 부여를 관리하기 위해 사용되는 토큰이다.
Access Token
•
인증된 사용자가 특정 리소스에 접근할 때 사용되는 토큰
◦
클라이언트는 Access Token을 사용하여 인증된 사용자의 신원을 확인하고, 서비스 또는 리소스에 접근한다.
◦
유효 기간이 지나면 만료(expired) 된다.
◦
만료된 경우에는 새로운 Access Token을 얻기 위해 Refresh Token을 사용한다.
Refresh Token
•
Access Token의 갱신을 위해 사용되는 토큰
◦
일반적으로 Access Token과 함께 발급한다.
◦
Access Token이 만료되면 Refresh Token을 사용하여 새로운 Access Token 발급
◦
사용자가 지속적으로 인증 상태를 유지할 수 있도록 도와준다 (매번 로그인 다시 하지 않아도 됨).
◦
보안 상의 이유로 Access Token 보다 긴 유효 기간을 가진다.
JWT 방식의 장점
•
확장성이 좋다.
◦
토큰만 있으면 다른 도메인 서버에 요청을 하더라도 바로 인증 가능하다.