JWT
JWT란?
JWT(json web token)은 보통 로그인 할 때 사용되는 암호화된 인증 방식입니다.
JWT는 세 가지 부분으로 나뉩니다.
헤더.내용.서명 으로 이루어져 있습니다.
헤더(header)
jwt의 헤더는 암호 알고리즘과 타입이 정의 되어 있습니다.
이 헤더가 BASE64 인코딩 되게 됩니다.
내용(payload)
내용 부분에는 claim이라는 토큰 훅은 사용자에대한 정보를 저장합니다.
내용 부분에 꼭 이것을 넣어야한다고 정해져 있는 것은 없습니다.
claim은 세가지 타입이 있습니다.
Registered claims:미리 정의 되어 있는 claim들의 집합 입니다. 이것들은 의무적이지는 않지만 권장됩니다.
ex)iss(issure),exp(expiration time),sub(subject),aud(audience)
Public claims:이것들은 jwts에의해 정의될 수 있습니다.그러나 충돌을 방지 하기 위해 IANA JSON Web Token Registry에 규칙을 따라야 합니다.
Private claims:이곳은 커스텀 claims입니다. 당사자 들 끼리 정보를 주고받는데 사용됩니다.
이러한 payload가 BASE64 인코딩 됩니다.
서명(signature)
signature부분을 생성하기위해 인코딩된 헤더, 인코딩된 내용, 시크릿 키,헤더에 정의된 암호 알고리즘이 필요합니다.
예를들어 만약 HMAC SHA256알고리즘을 사용해 서명 부분을 생성 한다면 다음과 같습니다.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
서명 부분은 메세지가 훼손되지 않았는지 확인할때 사용됩니다.또는 누가 보낸것인지 확인할때 사용됩니다.
이제 이러한 헤더,내용,서명을 합치면 다음과 같은 형태의 문자열이 됩니다.
JWT의 동작 법
만약 사용자의 요청에의해 로그인이 성공적으로 이루어지면 토큰이 발급될 것 입니다.
토큰은 인증서 이기 때문에 보안 문제가 발생하지않도록 주의가 필요합니다.
일반적으로 당신은 토큰을 필요 이상으로 오래 가지고 있으면 안됩니다.
또한 보안이 취약하므로 민감한 세션 데이터를 브라우저의 스토리지에 저장해서는 안됩니다.
사용자가 보호받는 경로 또는 자원에 접근하고 싶을 때 마다 user agent는 JWT를 보내야합니다. 일반적으로 인증 헤더에 Bearer 스키마를 사용합니다. 다음과 같은 형태를 가집니다.
만약 헤더에 Authorization 에 토큰을 넣어 보낸다면 서버는 토큰이 유효한지 체크를 할 것 입니다.
만약 유효하다만 적절한 리소스를 응답 해 줍니다.
만약 JWT가 Authorization헤더에 안에 넣어져 전송된다면 쿠키를 사용하지 않기 때문에 CORS는 문제되지 않습니다.
다음 다이어그램은 어떻게 JWT가 획득 되고 사용되는지 보여줍니다.
1.클라이언트가 인증 서버에 인증을 요청합니다.이것은 다른 인증 플로우들 중 하나를 통해 행해집니다.
2.인증이 생성되면 인증서버는 클라이언트에게 토큰을 발급합니다.
3.이후 클라이언트는 보호된 자원에 접근할때 토큰을 사용합니다.