JWT, 어렵지 않게 사용하기 - JWT❓

2020. 5. 21. 20:40BACKEND

안녕하세요.

이 번 포스팅은 토큰 기반 인증에 대해서 알아보겠습니다.

JWT 는 JSON Web Token이라는 의미를 갖고 있습니다. 

정보를 비밀리에 전달하거나, 인증을 할 때 사용하게 됩니다.

이 번 포스팅으로 JWT에 대해 더 자세히 알아보고, 사용해보도록 하겠습니다.

 

 

***************** INDEX *****************

[1장]

Token 기반 인증

 

[2장]

🌈 JWT❓ 

🏰 JWT 구조

 

********************************************

 


 

🌈  첫 번째, JWT❓

JWT는 JSON Web Token입니다.

Token 기반 인증의 대명사죠 〰️

JWT를 사용해서 두 개체 사이(ex. 클라이언트와 서버)에서 JSON 객체를 사용하여 정보를 안전성 있게 전달할 수 있습니다.

공식 홈페이지 :https://jwt.io/

 

 

✔️JWT, 왜 쓸까❓

단순한 String 형태이기 때문에 가볍고, 데이터를 토큰 내부에 포함(self-contained)합니다.

HTTP 헤더나 URI 파라미터를 이용해 전달할 수 있으며,

RFC 표준 (인터넷 상의 규칙과 표본을 정의해둔 곳)으로 등록되었기 때문에다양한 프로그래밍 언어 (C, Java, PHP, JavaScript, Swift … )에서 지원을 해주고 있습니다.

이제 JWT가 어떻게 생겼고, 어떻게 인증을 하는지 확인해볼게요❗️

 

🏰  두 번째, JWT의 구조

JWT는 복잡하고 읽을 수 없는 String 형태로 지정되어있습니다.

 

 

JWT 형태

 

위의 그림처럼 굉장히 복잡하고 난해한 스트링이죠 😅

크게 세 부분으로 나뉘며 온점(.)을 통해 연결되어있어요.

이제, 각각의 구조가 어떤 영역을 뜻하는 지 알아볼까요 ❓

 

JWT 구조

위의 그림의 구조를 가지고 있습니다.

하나씩 살펴볼까요❓

✔️ header

 

 

JWT 헤더 부분에는 토큰을 해싱할 알고리즘과 토큰의 타입을 지정할 수 있습니다.

 

 

✔️ Payload

Payload부분에는 토큰에 담을정보를 담습니다.

 

Payload의 name : value 의 한 쌍의 ‘조각’ 을 클레임claim이라고 부르는데요, 토큰에는 여러 개의 클레임들을 넣을 수 있습니다.

클레임은 크게 registered claim, public claim, private claim으로 나눌 수 있습니다.

 

register claim

토큰에 대한 정보들을 담기 위하여 이름이 이미 정해진 클레임을 의미합니다.

 

iss : 토큰발급자(issuer)

sub : 토큰 제목(subject)

aud : 토큰 대상자audience

exp : 토큰의만료시간(expiraton). 시간은Numeric Date형식이어야 하며 (예: 1480849147370) 항상 현재 시간보다 이후로 설정되어 있어야 합니다.

iat : 토큰이 발급된 시간(issued at). 토큰의 age 가 얼마나 되었는지 판단합니다.

 

 

public claim

공개된 클레임은 이름이 겹치지 않도록collision-resistant주의해야 합니다.

클레임 이름으로 URI를 사용할 수 있습니다.

 

 

 

private claim

등록된 클레임도 아니고, 공개된 클레임들도 아닌 데이터를 의미합니다.

클라이언트와 서버 합의 하에 사용하기로 약속한 이름을 의미합니다.

이름이 중복 될 경우가 있으니 사용 시 유의해야합니다 ❗️

 

 

위의 그림을 보시면 idx, id, age라는 값을 넣어주었어요.

JWT를 복호화하면 idx, id, age를 얻어낼 수 있다는 의미입니다 ❗️ 

 

 

✔️ Verify Signature

 

마지막부분에는 JWT 해싱할 때, 복호화할 수 있는 비밀키가 같이 포함되어있습니다.

your-256-bit-secret 에 자신의 비밀키를 넣으면 됩니다.

 

 

만약, JWT를 해싱하고 싶다면 공식홈페이지로 가보면 됩니다.

 

 

 

왼쪽은 Encoded된 JWT가 보여지고, 오른 쪽엔 Decoded가 된 정보들이 나열됩니다.

JWT를 다루는 방식은 이 전 포스팅에서 Access Token & Refresh Token 을 다루는 부분을 보면 될 것 같아요 〰️