[WEBSERVER] JWT(JSON WEB TOKEN)?


JWT(JSON Web Token)?

JSON형식으로 웹에서 사용하는 토큰? JSON 객체로서 당사자간에 안전하게 정보를 전송할 수있는 작고
독립적 인 방법을 정의하는 공개 표준 ( RFC 7519 )이라고 한다.

사용?
토큰기반인증에 사용하거나 안전한 정보교환이 필요할때 유용하다고 한다.

구조?
.을 구분자로 3가지의 문자열로 되어있다. 헤더(header).내용(payload).서명(signature)

헤더:
{
“typ”: “JWT”, // 토큰타입
“alg”: “HS256” // 해싱 알고리즘정보
}

내용:
정보의 한 ‘조각’ 을 클레임이라고 한다.클레임은 사용자에 대한 프로퍼티나 속성을 넣는다.
registered, public, private claims으로 구분한다.

registered claim
미리 정의된 claim으로써, 토큰에 대한 정보이다.

public claim
공개적인 claim을 명시하는데, 충돌 방지를 위해 URI 형식으로 작성한다.

private claim
서버와 클라이언트가 협의한 claim을 명시한다.
이미 정해져 있는 이름을 가진 아래의 7개에 대한 정보를 담을 수 있다.

iss : Token 발행자(Issuer)
sub : Token의 제목 (Subject)
aud : Token 의 대상자 (Audience)
exp : Token의 유효한 날짜 정보(Expiration time)
nbf : Token 의 유효 시작 날짜 정보 (Not before)
iat : Token의 발행된 날짜 정보(Issued At)
jti : Token 의 고유 식별자(JWT ID)

Claim을 JSON 행태로 정의한다.

예시:
{
“userId”:”skarl”,
“exp”: “1485270000000”,
“role”:[“admin”]
}
사용시에는 BASE64 인코딩을 통해서 문자열로 변환한다.

서명:
서명은 헤더의 인코딩값과, 정보의 인코딩값을 합친후 주어진 비밀키로 해쉬를 하여 생성한다.

서명을 만드는 수도코드 구조

1
2
3
4
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
"kkkkmysecret")

해쉬 -> base64로 인코딩 후 사용

like this
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJza2FybCIsImV4cCI6IjE0ODUyNzAwMDAwMDAiLCJyb2xlIjpbImFkbWluIl19.jAafdBOQCoZkV-xMcJx0BCTH45AqYtf9mcdKog4ewjc

example
https://jwt.io/ 공식 홈페이지에서 테스트 해볼 수 있다.

공홈 테스트