JWT 개발자 참고 자료

JWT 디코딩 코드 예제

애플리케이션 코드에서 JWT를 읽되 디코딩을 신뢰 증명으로 착각하지 않도록 최소 예제로 사용합니다.

언어별 JWT 디코딩 예제

JavaScript (browser)

function decodePart(part) {
  const base64 = part.replace(/-/g, "+").replace(/_/g, "/");
  const padded = base64.padEnd(base64.length + ((4 - (base64.length % 4)) % 4), "=");
  const binary = atob(padded);
  const bytes = Uint8Array.from(binary, c => c.charCodeAt(0));
  return JSON.parse(new TextDecoder("utf-8").decode(bytes));
}

const [header, payload] = token.split(".");
console.log(decodePart(header));
console.log(decodePart(payload));

Node.js

const [header, payload] = token.split(".");
const decodePart = part => JSON.parse(Buffer.from(part, "base64url").toString("utf8"));

console.log(decodePart(header));
console.log(decodePart(payload));

Python

import base64, json

def decode_part(part):
    part += "=" * (-len(part) % 4)
    return json.loads(base64.urlsafe_b64decode(part).decode("utf-8"))

header, payload, _ = token.split(".")
print(decode_part(header))
print(decode_part(payload))

Java

import java.nio.charset.StandardCharsets;
import java.util.Base64;

String[] parts = token.split("\.");
String headerJson = new String(Base64.getUrlDecoder().decode(parts[0]), StandardCharsets.UTF_8);
String payloadJson = new String(Base64.getUrlDecoder().decode(parts[1]), StandardCharsets.UTF_8);

System.out.println(headerJson);
System.out.println(payloadJson);

C#

using System;
using System.Text;

static string DecodeBase64Url(string part) {
    string value = part.Replace('-', '+').Replace('_', '/');
    value = value.PadRight(value.Length + ((4 - value.Length % 4) % 4), '=');
    return Encoding.UTF8.GetString(Convert.FromBase64String(value));
}

var parts = token.Split('.');
Console.WriteLine(DecodeBase64Url(parts[0]));
Console.WriteLine(DecodeBase64Url(parts[1]));

Go

package main

import (
    "encoding/base64"
    "fmt"
    "strings"
)

func main() {
    parts := strings.Split(token, ".")
    header, _ := base64.RawURLEncoding.DecodeString(parts[0])
    payload, _ := base64.RawURLEncoding.DecodeString(parts[1])
    fmt.Println(string(header))
    fmt.Println(string(payload))
}

PHP

function decode_base64url(string $part): string {
    $value = strtr($part, '-_', '+/');
    $value .= str_repeat('=', (4 - strlen($value) % 4) % 4);
    return base64_decode($value, true);
}

[$header, $payload] = explode('.', $token);
var_dump(json_decode(decode_base64url($header), true));
var_dump(json_decode(decode_base64url($payload), true));

모든 언어에서 지키는 원칙

  • 일반 Base64라고 가정하지 않고 Base64URL을 올바르게 처리합니다.
  • JSON 파싱 전에 UTF-8로 디코딩합니다.
  • 서명 검증 전에는 header/payload를 신뢰하지 않습니다.
  • issuer, audience, 시간, 알고리즘 정책은 애플리케이션 설정에서 결정합니다.