[TIL] JWT

go286·2021년 3월 23일
0
post-thumbnail

1. JWT란?

JSON Web Token은 웹표준으로서 두 개체에서 JSON 객체를 사용하여 가볍고 자가수용적인 방식으로 정보를 안전성 있게 전달해주는 것을 의미힌다.

장점

  • 수많은 프로그래밍 언어에서 지원된다.
  • JWT는 필요한 모든 정보(토큰에 대한 기본정보, 전달할 정보, signature)를 자체적으로 지니고 있다.
  • 두 개체 사이에서 손쉽게 전달 될 수 있고 웹서버의 경우 HTTP의 헤더에 넣어서 전달 할 수 있다.

2. 어떤 상황에 사용되는가

회원인증

  • 로그인
  • 서버는 유저의 정보에 기반한 토큰을 발급하여 유저에게 전달
  • 유저가 서버에 요청할 때 마다 JWT 를 포함하여 전달
  • 서버가 클라이언트에게 요청을 받을때 마다 해당 토큰이 유효하고 인증됐는지 검증, 권한이 있는지 확인하여 작업을 처리

정보교류

  • 정보가 sign이 되어있기 때문에 정보를 보낸이가 바뀌지 않았는지, 정보가 도중에 조작되었는지 검증 가능

3. JWT의 생김새

JWT는 .을 구분자로 3가지의 문자열로 되어있다.

헤더(Header)

헤더는 두가지의 정보를 지니고 있다.
type : 토큰의 타입을 지정한다.
alg : 해싱 알고리즘을 지정한다.

{
"typ" : "JWT",
"alg" : "HS256"
}
base64 인코딩 =>
Result:
header : eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

정보(payload)

정보 부분에는 토근에 담을 정보가 들어있다. 여기에 담는 정보의 한 조각을 클레임이라고 부르고, 이는 name,value의 한 쌍으로 이루어져있다.

클레임의 종류

  • 등록된 클레임
  • 공개 클레임
  • 비공개 클레임

{
"iss": "go286.com", //토큰 발급자 //등록
"exp": "1485270000000", // 토큰의 만료시간 //등록
"https://go286.com/jwt_claims/is_admin": true, //공개
"userId": "11028373727102", //비공개
"username": "go286" //비공개
}
base64 인코딩 =>
Result:
payload: eyJpc3MiOiJnbzI4Ni5jb20iLCJleHAiOiIxNDg1MjcwMDAwMDAwIiwiaHR0cHM6Ly9nbzI4Ni5jb20vand0X2NsYWltcy9pc19hZG1pbiI6dHJ1ZSwidXNlcklkIjoiMTEwMjgzNzM3MjcxMDIiLCJ1c2VybmFtZSI6ImdvMjg2In0.

서명(signature)

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

서명 부분을 만드는 슈도코드(pseudocode) 구조

HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
) //체크박스 secret base64 encoded
문자열을 인코딩 하는게 아닌 hex -> base64인코딩 해야한다.
Result:
signature: MX-PsAy1xLkX0UOwxf-gqV5Ine-la-Q6bMzQ_EpQyNM

헤더 + 정보 + 서명

위에서 구한 값들을 .을 중간자로 다 합쳐주면 하나의 토큰이 완성된다.

4. 참조

https://velopert.com/2389
https://jwt.io/

0개의 댓글