[JWT] Json Web Token이란?

KosMos·2022년 9월 28일
0

1. JWT(Json Web Token)란?

JWT는 개체와 개체 간에 정보 전달권한 인가(Authorization)를 위해 사용되는 토큰입니다.
URL-safety하기 때문에 Header 또는 URL을 통해 전달합니다.

2. JWT 구조

JWT는 Header, Payload, Signature로 이루어져있습니다.
각 부분은 Json형태로 저장되어 있으며, 각각 Base64로 인코딩 되어 있고, "." 을 구분자로 각각 부분을 구분합니다.

Header : 토큰에 대한 기본정보
Payload : 전달할 정보
signature : 검증된 토큰 정보

1) HEADER(헤더)

토큰에 대한 기본 정보가 저장됩니다.

alg : Signature를 어떤 알고리즘으로 암호화 했는지 명시한다. (ex : SHA256, RSA)
typ : 토큰의 타입을 지정한다. (ex : jwt)

2) PAYLOAD(페이로드)

전달하려고 하는 정보가 저장되어있습니다. PAYLOAD는 크게 3가지로 구분됩니다.

등록된 클레임(Registered Claim)

이름이 이미 정해진 클레임입니다. 등록된 클레임은 모두 선택적으로 사용할 수 있습니다.

iss(issuer) : 토큰 발급자
sub(subject) : 토큰 제목
aud(audience) : 토큰 대상자
exp(expiration) : 토큰 만료 시간, NumericDate 형식으로 저장된다. (ex : 1480849147370)
nbf(not before) : 토큰 활성 날짜, 이 날이 지나기전에 토큰이 활성화되지 않는다.
iat(isuued at) : 토큰 발급 시간, 토큰 발급 이후의 경과시간을 알 수 있다.
jti : JWT의 고유 식별자, 중복적인 처리를 방지하기 위해서 사용한다.

공개 클레임(Public Claim)

사용자 정의 클레임으로, 공개용 정보를 위해 사용됩니다.

비공개 클레임(Private Claim)

서버와 클라이언트 간 협의하에 사용되는 클레임입니다.

3) Signature(서명)

토큰의 유효성을 검증할 때 사용하는 서명입니다. 서명은 헤더와 페이로드의 값을 각각 BASE64로 인코딩하고 "."를 구분자로 붙여줍니다. 그리고 비밀키를 이용해 헤더에서 정의한 알고리즘으로 암호화한 후, 다시 BASE64로 인코딩합니다.

//sha256으로 암호화 할 경우
header = base64_encode(header_json)
payload = base64_encode(payload_json);
signature = base64_encode(HMAC_SHA256(header + "." + payload, secret))
jwt = header + "." + payload + "." + signature

3. JWT의 용도

회원 인증

회원이 로그인을 하면 서버는 회원정보가 담긴 토큰을 발급해 줍니다. 그리고 회원이 서버에 데이터를 요청 할 때 마다 발급 받은 토큰 정보를 함께 전달하여, 인증받은 회원이라는 것을 증명합니다.

정보 전달

JWT는 Signature 정보를 이용해서 데이터 조작을 방지할 수 있으며, 안전하게 정보를 전달할 수 있습니다.

4. JWT의 장단점

장점

1) Stateless이며 확장성이 있다.

서버와 클라이언트 간에 상태 정보를 저장하지 않으며 토큰을 가지고 있고 유효하다면 서버로 부터 데이터를 요청할 수 있습니다. 즉 개체간에 연결을 유지하지 않아도 됩니다.

서버를 여러대 사용하거나, 클라이언트 단말의 종류(PC, 모바일 등..)가 다양할 경우에도 토큰만 유효하다면 어떤 단말이든지간에 서버로 부터 데이터를 받을 수 있습니다.
즉 JWT 인증 시스템을 만들어 두면 플랫폼에 상관없이 회원 인증 시스템 및 정보 전달이 가능합니다.

2) 사용자 인증에 필요한 인증 저장소가 필요없다.

인증 정보가 토큰 자체에 포함되어있기 때문에 별도의 인증 저장소가 필요없습니다.

단점

1) 한번 발급된 토큰은 수정 및 삭제할 수 없다.

JWT는 stateless하기 때문에 토큰에 대한 정보를 관리하지 않습니다. 그래서 한번 만들어진 토큰은 삭제, 수정할 수 없습니다. 만약 토큰이 유출된다면 토큰이 만료될 때 까지 토큰을 가로챈 사용자가 서비스를 이용할 수 있습니다.

2) Payload 인코딩

Payload 값이 암호화된 값이 아닌 Base64로 인코딩 된 값이라 누구나 확인할 수 있습니다.
그래서 중요한 정보를 Payload에 저장해서는 안됩니다.

0개의 댓글