ツール

JWTデコード・エンコード|署名検証(HS/RS/ES)もブラウザ内で安全に

サーバーにデータは保存していないため、安全にはご利用頂けます。

ヘッダー
ペイロード
クレーム解析
署名(Base64URL)

🔒 入力内容はサーバーへ送信されず、すべてブラウザ内で処理します。

JWTとは(3つの構造)

JWT(JSON Web Token)は、
ヘッダー・ペイロード・署名の3つを
ドットでつないだ文字列です。
主にログインの認証トークンに使われます。

ヘッダーとペイロードはBase64URLで“エンコード”されただけ
暗号化ではないので、
誰でもデコードして中身を読めます。
秘密情報をそのまま入れてはいけません。

デコードとエンコードの使い方

上のツールの「デコード・検証」にJWTを貼ると、
ヘッダー・ペイロード・クレーム
(exp / iat / nbf の日時や期限切れ)を解析します。

秘密鍵や公開鍵を入れれば署名の有効・無効も判定。
「エンコード(生成)」タブでは、
アルゴリズムと鍵を指定して
署名付きJWTを作れます。

署名アルゴリズムの違い(HS・RS・ES)

HS256(HMAC)は共通の秘密鍵で署名・検証。
手軽ですが、鍵を知る全員が発行できます。

RS256 / ES256は公開鍵方式。
秘密鍵で署名し、公開鍵で検証します。
検証側に秘密鍵を渡さずに済むので、
配布・マイクロサービス向きです。

各言語でJWTを扱う方法

実装では、自作せず定番ライブラリを使うのが安全です。

JavaScript / Node.js

import jwt from 'jsonwebtoken'

const token = jwt.sign({ sub: '123' }, secret)   // 生成(HS256)
const payload = jwt.verify(token, secret)         // 検証つきデコード
jwt.decode(token)                                 // 署名検証なしでデコード

Python

import jwt  # PyJWT

token = jwt.encode({"sub": "123"}, key, algorithm="HS256")
payload = jwt.decode(token, key, algorithms=["HS256"])   # 検証つき

Java

// io.jsonwebtoken : jjwt
String token = Jwts.builder().subject("123").signWith(key).compact();

Claims claims = Jwts.parser().verifyWith(key).build()
    .parseSignedClaims(token).getPayload();

Kotlin

val token = Jwts.builder().subject("123").signWith(key).compact()

val claims = Jwts.parser().verifyWith(key).build()
    .parseSignedClaims(token).payload

よくある間違い・注意点

ペイロードにパスワードなどの機密を入れる(中身は丸見え)
署名を検証せずに信用してしまう
alg=noneや alg のすり替えを受け入れる
有効期限(exp)を検証しない
秘密鍵・署名鍵をクライアントに置く

よくある質問

JWTは暗号化されていますか?

いいえ。ヘッダーとペイロードは
Base64URLエンコードされているだけです。
誰でも中身を読めるので、機密は入れないでください。

このツールに貼ったJWTは送信されますか?

送信されません
デコードも署名検証・生成も、
すべてブラウザ内で処理し、保存もしていません。

HS256とRS256はどちらを使うべき?

単一のサービス内ならHS256で十分。
検証側が複数、鍵を配りたくないなら
公開鍵方式のRS256 / ES256が向いています。

署名の検証には何が必要ですか?

HMAC(HS系)は署名時と同じ秘密鍵
RSA/ECDSA(RS・ES系)は対応する公開鍵です。
このツールも同じ鍵を入れれば検証できます。

JWTは「読めるが、改ざんは署名で防ぐ」仕組み。
中身の確認とデバッグに、
このページをブックマークして
サッと使ってくださいね。
それではまた!