Json Web Token
JWT 란 인증에 필요한 정보들을 암호화시킨 JSON 토큰이다.
그리고 이 토큰을 HTTP 헤더에 실어 클라이언트를 식별하는 방식이 JWT 기반 인증이다.
- 클라이언트가 JWT를 서버로 전송하면, 검증을 하고 완료되면 응답을 한다.
- Base64 URL-safe Encode를 통해 인코딩하여 직렬화 했으며,
- 토큰 내부에는 위변조 방지를 위한 전자서명도 있다
JWT 구조
XXXXXXXX.YYYYYYY.ZZZZZZ
헤더 + 내용 + 서명 순으로 구성된다.
- 헤더
JWT에서 사용할 타입과 해시 알고리즘 종류가 담겨 있다.
- 내용
서버에서 첨부한 사용자 권한 정보와 데이터가 담겨있다. ( 사용될 정보에 대한 내용)
- 서명
개인키로 서명한 전자서명이 담겨있다.
이 서명은 암호화를 위한 키와 복호화를 위한 키가 따로 있다.
JWT 인증 과정
- 사용자가 ID,PW 로 로그인 인증을 요청한다.
- 서버에서 클라이언트로부터 인증 요청을 받으면, Header,PayLoad,Signature를 정의한다.
- Base 64 로 암호화 하여, JWT를 생성하고 이를 쿠키에 담아 클라이언트에게 발급한다.
- 클라이언트는 JWT를 스토리지에 저장한다.
- API를 서버에 요청할 때 Authorization header에 Access Token을 담아 보낸다.
- 서버가 할 일은 클라이언트가 Header에 담아서 보낸 JWT가 내 서버에서 발행한 것인지 일치 여부를 확인한다.
- 일치가 되면 페이로드의 정보를 클라이언트에게 돌려준다.
- 클라이언트가 서버에 쵸엉을 했는데 , Access Token의 시간이 만료되었다면, Refresh 토큰을 이용해 새로운 Access Token을 발급받는다.
JWT 서명은 인증이 목적이다.
서버는 토큰안에 정보가 중요한 것이 아닌, 해당 토큰이 유효한 토큰인지 확인하는 것이 목적이다.
payload에 담긴 자료들은 노출이 쉽기 대문에 비밀번호와 같은 정보는 넣으면 안된다.
정보보호가 아닌 위조 방지가 목적이다.
JWT 장점
- Header와 Payload를 가지고 Signature를 생성하므로 데이터 위조를 막는다.
- 인증 정보에 대한 별도의 저장소가 필요없다.
- JWT 토큰은 자체적으로 검증이 됐음을 증명할 수 있다.
- 세션 (클라이언트의 인증정보를 저장) 과는 다르게 stateless 가 가능해진다.
=> 서버 확장성
- 쿠키와 달리 다른 로그인 시스템에 접근 및 권한 공유가 가능하다.
- OAuth 의 경우 소셜 계정을 이용해 웹서비스 로그인이 가능하다.
- 앱에서 사용가능하다(세션은 불가능)
- DB 조회를 하지않아도 된다
JWT 단점
- 토큰 자체에 정보가 담겨있어 위험할 수 있다.
- 길이가 길어 부하를 줄 수 있다.
- 토큰을 탈취하여 디코딩을 통해 데이터를 볼 수 있다.
- 토큰을 클라이언트 측에서 관리하고 저장하기 때문에, 탈취에 대처가 어렵다.
Access / Refresh Token
이런 탈취의 위험 때문에 이중으로 권한을 나눈 것이 Refresh Token이다.
둘 다 똑같은 JWT 이지만, 토큰이 어디에 저장되는지 차이가 난다.
Access Token
Refresh Token
- 새로운 Access Token을 발급해주기 위해 사용하는 토큰으로 짧은 수명을 가지는 Access토큰을 재발급 하여 연장 시켜준다.
- 이 토큰은 보통 DB에 유저 정보와 같이 기록해준다.