본문 바로가기
기초지식

JWT (Json Web Token) 란 ?

by 광진구뚝배기 2023. 4. 23.

시작하는

 

업무 회의 시간에 JWT란 것을 처음 알게 되었는데, 지금 만들고 있는 사이드 프로젝트에 적용하면 좋을 것 같아 소스 분석 및 개발을 진행하며 알게된 내용을 정리하고자 한다. 단순 jwt만 사용한 것이 아닌  jwt와 spring security를 접목시켜 개발했다. 예제 소스를 확인하고자 한다면 yujin's github 를 참고하길 바란다.

 

설명하기에 앞서 서버가 클라이언트 인증하는 방식에 대해 먼저 공부하고 오면 좋다.

이는 Cookie / Session / Token 이란 ? 게시글을 참고하면 된다.

 

 

 

 

JWT 란 ?

 

Token 인증 방식 중 가장 널리 알려진 방법이 바로 JWT(Json Web Token) 이다.

이름에서 알 수 있듯이 JSON 객체를 사용하여 토큰 자체에 정보를 저장하는 Web Token 이다.

 

위 사진은 필자가 현재 개발중인 프로젝트에서 발급한 token 인데 자세히 살펴보면 ' . ' 이 두 개가 있다.

JWT는 이를 기준으로 헤더(header) - 내용(payload) - 서명(signature) 으로 이루어져있으며, 각각의 영영에는 Json 정보가 UTF-8로 인코딩한 뒤 Base64 URL-Safe로 인코딩한 값이 들어가 있다. 이는 손쉽게 디코딩 되기 때문에 암호화되었다고 볼 수는 없다.

 

 

 

 

Header / Payload / Signature 

 

Header

 

토큰의 타입과 해싱 알고리즘을 지정하는 정보를 포함하는 것으로 JWT를 검증하는데 필요한 정보를 담고있다.

 

typ  토큰의 유형(type)

alg  서명 알고리즘(algorithm)

{
"alg": "HS256"
"typ": "JWT"
}

 

 

Payload

 

실질적으로 인증에 쓰이는 데이터를 담고있으며, 데이터의 각 필드들을 Claim이라고 한다.

 

주로 클레임에 username 을 포함시켜 인증할 때  payload에 있는 이 username을 가져와 유저 정보를 조회하는데 이용한다. 주의할 것은 암호화되지 않은 값이므로 민감한 정보들은 제외해야 한다.

 

 

클레임의 종류로는 등록, 공개, 비공개 세가지가 있다.

 

등록된(registered) 클레임

서비스에서 필요한 정보들이 아닌, 토큰에 대한 정보를 담기 위해 이름이 이미 정해져있는 클레임이다. 이 클레임들은 모두 선택적(optional)이다.

 

- sub  인증 주체(subject)

- iat    발급 시각(issued at)

- iss   토큰 발급자(issuer)

- exp  토큰 만료 시간(expiration time)

- nbt   토큰 활성 날짜(Not Before)

- aud  토큰 수신자/대상자(audience)

- jti     JWT의 고유 식별자, 주로 중복 방지를 위해 사용하며 일회용 토큰에 유용하다

 

 

공개(public) 클레임

 

사용자가 원하는 대로 정의할 수 있다. 단, 충돌이 방지된 이름을 가지기 위해 클레임 네임을 충돌 방지 네임스페이스를 포함하는 URI형식으로 짓는다.

 

 

 

비공개(private) 클레임

 

등록된 클레임도 아니고, 공개클레임도 아니며 양 측간( ex. 클라이언트 <-> 서버 ) 협의하에 사용되는 클레임 이름이다. 공개 클레임과는 다르게 이름이 중복되어 충돌될 수 있어 사용에 유의해야 한다.

 

jwt payload 에서 숨겨진 정보를 전달 할 수 있다. 이 정보는 일반적으로 사용자에게 보여지지 않지만 서버에서 인증된 사용자를 확인 할 때 사용된다. 

 

 

 

{
"sub": "1234567890",
"name": "yujin",
"lat": 1516223022,
"admin": true
}

 

 

Signature

 

토큰이 조작되거나 변경되지 않았음을 확인하기 위한 방법이다. 서명은 header 의 인코딩 값과 payload의 인코딩 값을 합친 후에 주어진 비밀키를 통해 해쉬값을 생성한다.

 

Signature은 HMAC 또는 RSA와 같은 암호화 기술을 사용하여 생성된다.

 

HMAC의 경우, 공유 비밀키(Secret Key)를 사용하여 생성된다.

RSA의 경우, 개인키(Private Key)를 사용하여 생성된다.

 

 

 

JWT 인증 방식

 

1. Header / Payload가 변조되지 않았는지 확인한다.

2. Payload가 문제가 없는지 확인한다. ( ex. 만료일(exp) 등 )

3. 문제가 없다면 인증이 완료된다.

 

 

 

 

참고자료

 

- https://velog.io/@hahan/JWT%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

- https://etloveguitar.tistory.com/101

 

반응형

'기초지식' 카테고리의 다른 글

Spring Security란 ?  (2) 2023.04.26
Cookie / Session / Token 이란 ?  (0) 2023.04.23
Internet Explorer 11 지원 종료, Edge / Window11 전환 방법  (0) 2022.06.10
형상관리 란?  (0) 2022.01.11
Socket (소켓) 이란?  (0) 2022.01.05

댓글