JWTは「透明な封筒」?機密情報を守るための正しい作法を学ぼう
こんにちは。現場の最前線でセキュリティと向き合っているエンジニアです。
皆さんは「JWT(JSON Web Token)」という言葉を聞いたことがありますか?今のWeb開発ではログイン認証などで当たり前のように使われていますが、「署名(Signature)がついているから中身は見られないはず」という思い込みが、実は一番危険な落とし穴なんです。
今日は、JWTを「家の鍵」や「郵便物」に例えて、なぜJWTに機密情報を入れてはいけないのか、そして本当に守りたい情報をどう扱うべきかを一緒に紐解いていきましょう。
—
JWTの正体は「中身が透けて見える郵便物」
JWTは、大きく分けて「ヘッダー」「ペイロード」「署名」の3つのパーツで構成されています。
- ヘッダー: 「これはJWTという形式です」という名札のようなもの。
- ペイロード: ユーザーIDや権限などの「中身」。
- 署名: 「この手紙は本物ですよ」という証明印。
ここで重要なのは、「署名」があるからといって、中身が隠されているわけではないということです。
皆さんが送った郵便物を想像してください。封筒に「重要書類在中」と書かれたスタンプ(署名)が押されていても、中身が透明なビニール袋に入っていたら、通りすがりの泥棒に内容を盗み見られてしまいますよね?
JWTのペイロードはまさにこれと同じで、Base64という「誰でも簡単に元に戻せる形式」でエンコードされているだけです。暗号化されているわけではないので、URLにトークンを含めたり、ブラウザのストレージに保存したりすれば、悪意ある第三者は一瞬で中身を読み取れてしまいます。
「機密情報は入れない」のが鉄則
では、どうすればいいのでしょうか?最もシンプルで強力なルールは、「JWTの中に、人に見られて困る情報は一切入れない」ことです。
例えば、以下のような情報は絶対にNGです。
- パスワードのハッシュ値
- 個人情報(メールアドレス、住所、電話番号)
- 社外秘のプロジェクトコードやAPIキー
「ユーザーID」くらいであれば、公開されても大きな被害には繋がりませんが、それ以上の情報を載せるのは「家の鍵を透明なケースに入れて持ち歩く」のと同じくらい危ない行為だと認識してください。
もし、どうしても隠したい情報があるなら?(JWEの登場)
「それでも、どうしてもサーバー側で処理するために情報を渡したい…」という場合もありますよね。そんな時に登場するのが JWE (JSON Web Encryption) です。
JWEは、JWTを「中身が読めない頑丈な金庫」に入れるような仕組みです。これを使えば、第三者が途中で盗み見ようとしても、正しい鍵(秘密鍵)がない限り中身はデタラメな文字列にしか見えません。
JWEの簡単な仕組み(イメージ)
[生データ] → [暗号化鍵でロック] → [JWE形式の文字列] → [相手側で復号]
もし皆さんがNode.jsなどで実装する場合、ライブラリを使って以下のようなイメージで暗号化を行います。(※`jose`ライブラリなどを使用する場合の例)
import { EncryptJWT } from ‘jose’;
// 暗号化したい機密情報
const secretData = { userId: 123, role: ‘admin’, secret_key: ‘my-super-secret’ };
// サーバーの公開鍵を使って暗号化する(JWEの作成)
const jwe = await new EncryptJWT(secretData)
.setProtectedHeader({ alg: ‘dir’, enc: ‘A128GCM’ }) // 暗号化アルゴリズムを指定
.encrypt(secretKey); // 秘密鍵でロックをかける
console.log(jwe); // これなら中身は暗号化されているので安心!
今すぐできる「一歩ずつ」の対策
まずは、今日から以下の3点を意識してみてください。
1. JWTをデコードして確認する: [jwt.io](https://jwt.io/) というサイトに自分のトークンを貼り付けてみてください。中身が丸見えであることに驚くはずです。「この情報、もし漏れたらマズいな」と思うものは、すぐにJWTから削除しましょう。
2. 機密情報はサーバー側で管理する: ユーザー情報はデータベースに保存し、JWTには最小限の「識別子(ユーザーIDなど)」だけを持たせるのが、現代のWebセキュリティの王道です。
3. HTTPSは必須: 通信経路を暗号化(HTTPS)していても、ブラウザの履歴やログからJWTが漏れるリスクはあります。JWTを「機密情報の入れ物」として使わない意識が、何よりも大切です。
最後に:セキュリティは「疑うこと」から始まる
セキュリティは、ツールを入れたら終わりではありません。「本当にこのデータはここに入れていいのか?」「もし漏れたらどうなる?」と、自分自身に問いかける癖をつけることが、最高のエンジニアへの第一歩です。
JWTは便利ですが、その「仕組み」を正しく理解すれば、恐れることはありません。一つずつ、確実に対策を積み上げていきましょう!
また何か疑問があれば、いつでも相談してくださいね。応援しています!

コメント