개인 프로젝트 진행 간 백엔드, 프론트 통신 단계에서 JWT라는 단어를 접하게되었다.
인증/인가, 세션과 토큰이라는 단어와 같이 나오는 단어였고, 대부분 큰플젝이 아니면 JWT쓴다고한다.
일단 찾아보고 공부하다보니 인증,인가 /세션, 토큰, 쿠키에 관한 이야기도 다른 글에서 추가로 적어 보도록하겠다.
JWT(Json Web Token)은 Json 객체에 인증이 필요한 정보들을 담은 후 비밀키로 서명한 토큰이다.
공식적으로 인증(Authentication) & 권한허가(Authorization) 방식으로 사용되는 인터넷 표준 인증 방식이다.
그리고, 필요한 모든 정보를 한 객체에 담아서 전달하기 때문에 JWT 한 가지로 인증을 마칠 수 있습니다.
( 보안 강화를 위해 예시로 JWE와 같은 방어 기술들을 함께 사용 가능합니다 )
JWT는 웹 표준(HTTP)을 따르기 때문에 대부분의 언어를 지원하기에 큰 장점으로 볼 수 있습니다.
가장 많이 사용되는 '로그인' 과정 위주로 풀어 보겠습니다.
JWT는 위와 같은 구조를 가지고 있습니다.
헤더, 내용, 서명이 '.'으로 구분하여 1개의 토큰을 이루고 완성된 토큰은 이와 같은 형태를 보입니다.
하단 토큰은 공식문서에서 예시이며, 인코더와 디코더를 볼 수 있으며
해당 링크를 통해 JWT 만들기 및 변하는 과정을 볼 수 있습니다.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
{
"alg": "HS256",
"typ": "JWT"
}
헤더에서는 해시 알고리즘과 토큰의 타입을 정의 할 수 있습니다.
HS256은 signature에서 HMAC SHA256을 의미하며, 해시 알고리즘 중 하나입니다.
타입의 값이 JWT은 이 토큰을 JWT로 명시해줍니다.
HS256에 대한 자세한 내용은 auth0 공식 문서를 통해 확인 가능합니다
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
내가 전달하고자하는 데이터를 포함할 수 있습니다.
데이터 각각의 Key를 claim이라고 부릅니다.
claim은 사용자가 원하는 Key, Value를 구성할 수 있으며,
registered, public, private 이렇게 3가지 종류가 있습니다.
registered claim:
필수는 아니지만 권장되는 미리 정의된 클레임 세트로 일부는 다음과 같습니다.
iss(발급자), exp(만료 시간), sub(주체), aud(대상) 등.
JWT는 압축되도록 되어 있으므로 클레임 이름은 3자 길이에 불과합니다.
public claim:
JWT를 사용하는 사람이 원하는 대로 정의할 수 있습니다.
그러나 충돌을 피하려면 IANA JSON 웹 토큰 레지스트리에서 정의하거나 충돌 방지 네임스페이스가 포함된 URI로 정의해야 합니다.
private claim:
이는 사용에 동의한 당사자 간에 정보를 공유하기 위해 생성된 사용자 지정 클레임이며 등록 클레임이나 공개 클레임이 아닙니다.
Payload는 Base64Url로 인코딩되어 JSON 웹 토큰의 두 번째 부분을 형성합니다.
서명된 토큰의 경우 이 정보는 변조로부터 보호되지만 누구나 읽을 수 있습니다.
⚡️ 암호화되지 않은 경우 JWT의 Payload 혹은 Header 요소에 비밀 정보는 넣으면 안된다.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
서명 파트는 Base64 인코딩된 Header "." Payload 그리고 secret이 필요합니다.
secret은 유저가 지정하는 비밀 코드이며, 위와 같이 해싱하면 서명이 완성됩니다.
사용 목적 : JWT 토큰은 사용자 인증과 로그인 유지를 위해 쓰인다
토큰의 구조 : Header, Payload, Signature
Header: 서명 알고리즘 (공개키/개인키 or 비밀키)
Payload : 토큰 정보(대상, 발급시각, 만료시각)
Signature : (Header+Payload) 서명 (인증용)
https://jwt.io/introduction
https://velog.io/@c65621/Session%EA%B3%BC-JWT
https://velog.io/@vamos_eon/JWT%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%EA%B0%80-1
https://velog.io/@chuu1019/%EC%95%8C%EA%B3%A0-%EC%93%B0%EC%9E%90-JWTJson-Web-Token