티스토리 뷰
1. 토큰이란?
토큰은 정보를 지닌 물리적 가상적 물체를 의미하는데 보안에서의 토큰은 사용자의 물리적인 소지품으로 열쇠, 바우처등으로 생각합니다.
예를들어, 놀이동산에 갓는데 회전목마 이용권을 이용한 사람이 다른 놀이기구를 타지 못하게 하며 회전목마는 이용할수 있다는 권한을 증명할 수 있도록 회전목마 이용권을 발행하여 줍니다. 이용객은 해당 이용권을 가지고 권한을 확인받을 수 있습니다. 서버에서도 로그인을 하면 해당 로그인한 사람이다 라는 이용권으로 주고 권한을 증명할때 사용하는것을 토큰이라 합니다.
2. JSON Web Token(JWT) 이란?
일반 토큰 기반은 과거에 많이 사용하던 방식으로 의미가 없는 문자열(Random String)으로 구성되어 있어 정보를 담을 수 없는 문제점을 지니고 있습니다.
이를 해결하고자 나은 클레임(Claim) 기반 토큰으로 JSON을 이용한 토큰이며, 웹표준(RFC 7519)를 구현한 것으로 자세한 것은 JWT공식홈페이지(https://jwt.io)으로 확인 할 수 있습니다.
클레임이란 사용자 정보나 데이터 속성등을 의미합니다. 따라서 클레임 기반 토큰이란 토큰안에 사용자 정보나 데이터 속성을 담고 있는 토큰이라 생각하면 됩니다.
JSON Web Token(JWT)는 헤더(Header), 페이로드(Payload), 서명(Signature) 세가지로 나뉘어저 있으며 각구분은 .구분자로 나누어 표현되며 각 값들은 BASE64로 인코딩되어 있습니다.
▶ Header
: 헤더(Header)에는 typ와 alg 두가지 정보로 구성되어 있습니다.
typ(type) : 토큰의 타입을 지정합니다.
alg(algorithm) : 해싱 알고리즘을 지정하며 주로 HMAC SHA256 또는 RSA를 사용하며 서명(Signature)에서 사용합니다.
{
"typ": "JWT",
"alg": "HS256"
}
위와 같은 형태입니다.
▶ Payload
페이로드(Payload)로 불리는 부분에는 위에서 설명한 클레임이라 불리는 사용할 정보들이 담겨 있습니다.
{ key : value} 형식으로 이루어저 있으며 다양한 정보를 넣을수 있습니다.
클레임의 종류는 다음과 같이 세가지로 나뉩니다.
1. 등록된 클레임(Registered Claim)
2. 공개 클레임(Public Claim)
3. 비공개 클레임(Private Claim)
등록된 클레임은 토큰정보를 표현하기 위해 이미 정해진 데이터 종류이며 선택적으로 작성 가능합니다.
iss: 토큰 발급자 (issuer)
sub: 토큰 제목 (subject)
aud: 토큰 대상자 (audience)
exp: 토큰의 만료시간 (expiraton)
-> NumericDate 형식으로 되어있어야 한다 (Ex: 1480849147370)
nbf: 토큰 활성 날짜
-> 이 날짜가 지나기 전 토큰은 활성화 되지 않는다.
iat: 토큰이 발급된 시간 (issued at)
-> 이 값을 사용하여 토큰 발급 이후 얼마나 시간이 지났는지를 알 수 있다.
jti: JWT의 고유 식별자
-> 중복 방지를 위해 사용하며, 일회용 토큰(Access Token 등)에 사용한다.
공개 클레임은 서로 충돌이 일어나지 않아야 하여 URL형태로 작성하며 다음과 같이 작성합니다.
{ "https://atoz.com": true }
비공개 클레임은 정보를 공유하는 개체간(ex 서버-클라이언트) 서로 동의하에 생성하는 클레임으로 다음과 같이 작성합니다.
{ "id" : "mkkim" }
▶ Signature
서명(Signature)로은 위에서 만든 Header와 Payload의 각 값을 BASE64로 인코딩 하고, 그 값을 비밀키를 이용해 헤더에서 정의한 알고리즘으로 해싱을 한뒤 이 값을 다시 BASE64로 인코딩하여 생성합니다.
정리
JWT토큰 페이로드에는 BASE64로 인코딩하여 전송하기 때문에 다시 디코딩하여 정보를 얻을수 있습니다. 그래서 중요한 정보를 담지 않는것을 추천드립니다.
'IT > IT 용어' 카테고리의 다른 글
[JavaScript] 구조분해할당 (0) | 2021.05.26 |
---|---|
CLI(Command Line Interface)란? (0) | 2021.05.11 |