JWT(Json Web Token)이란 Json 포맷을 사용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token이다. JWT는 토큰 자체를 정보로 사용하는 Self-contained 방식으로 정보를 안전하게 전달한다.
JWT 구조
JWT는 Header, Payload, Signature의 3부분으로 이루어지며, Json 형태인 각 부분은 Base64로 인코딩되어 표현된다. 또한 각각의 부분을 이어주기 위해서는 (.) dot 구분자를 사용한다. Base64는 암호화된 문자열이 아니고, 같은 문자열에 대해 항상 같은 인코딩 문자열을 반환한다.
sdddfjsadddlkfjaskldf.sdkddldfjasljfa.asdklfjaslkfjdd // 헤더(header).내용(payload).서명(signiture)
- 헤더에는 사용한 해쉬 알고리즘과 토큰 타입 정보가 담겨있다.
- payload에는 json 타입의 데이터가 들어있다. payload로 변환할 때에는 식별할 수 있는 값을 payload로 변환한다.
- 서명은 암호화 키가 담겨있다.
JWT 자체로는 해독하기가 쉽기 때문에 비밀번호와 같은 민감한 정보는 담지 않는다. 또한 JWT 이용을 위한 secretkey를 서버에서 잘 관리해야하며, 이는 세션 스토리지와 연결하지 않고 시크릿 키만을 이용해서 토큰을 만들어내며, 가진 시크릿 키로 유효성을 검사한다.
JWT는 해커에게 탈취당할 수가 있는데, 이때 접근 권한을 관리자로 변경할 수 있으며, 만료 기간을 정해서 만료된 토큰의 경우 검증에서 통과하지 못하도록 할 수 있다. 하지만 짧은 인증 기간으로 인해 매번 토큰을 생성해줘야하는 것이 불편하므로, Refresh token이 등장했다. Refresh token은 최초 로그인 시 액세스 토큰(만료 30분)과 Refresh 토큰(만료 2주)을 함께 만들어 Refresh token은 따로 저장소에 저장하고, 클라이언트에게 두 정보를 전송한다. 클라이언트의 요청 시 액세스 토큰이 만료되었다면 refresh token을 통해 검증하고 올바른 refresh token인 경우에는 새로운 access token을 생성해 전달 및 할당한다.