JWT の使用をやめよう

2026/06/17 1:49

JWT の使用をやめよう

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

改善されたサマリー:

通常のクッキーセッションは、Web アプリケーションにおけるユーザー認証の管理において優れており、JSON Web トークン(JWT)と比較してより高いセキュリティと柔軟性を提供します。JWT は厳密に約 5 分以内という極めて短い期間のために設計されていますが、セッションは個別のデータストアを各リクエストに依存させることなく、より長いライフサイクルを安全に管理します。現在の JWT の使用における重大な欠陥は、仕様が偽造トークンの作成を可能にしている点であり、標準的なセッション管理はこのリスクを効果的に排除します。

本文

JWT(JSON Web Tokens)をセッション保持に使用すべきではない理由

結論:通常のクイークセッションへの移行を推奨します

ユーザーのログイン状態(セッション)を保持させる目的で JWT を使用するのは非推奨です。

  • JWT はもともとセッション管理のために設計されたものではありません。
  • セッション管理には、はるかに**優れた「通常のクイークセッション」**が利用可能です。

詳しく知りたい場合は、以下のプレゼンテーションをご覧いただくことを強く推奨します。

📺 [推奨動画] Session tokens, statelessness, and why you should stop using JWT: https://www.youtube.com/watch?v=pYeekwv3vC4

⚠️ 注意: 本動画では CSRF 保護など他の重要なトピックに深く触れられていないため、それらについては別途学習が必要です。また、動画で言及されている「JWT の妥当なユースケース」については、より安全性が高く優れたツール(例:PASETO)で代替可能です。

🔒 認証情報の保存に関する重要注意点

認証情報(JWT トークンを含む)を

localStorage
sessionStorage
に直接保存すべきではありません。


JWT を避けるべき具体的な理由

1. 有効期限の制約との矛盾

  • JWT の仕様は、極めて短い有効期限(約 5 分以下)を持つトークンのみで設計されています。
  • セッション管理にはそれよりも長いライフタイムが必要であり、この要件を満たすことができません。

2. 「ステートレス」認証の非現実性

  • 「ステートレス」という概念は誤解を招く言葉であり、真に安全な状態なし認証を実現するには莫大なリソースが必要です。
  • トークンを安全に扱うためには、何らかの状態情報(state)を保持する必要があるため、データストアの利用は避けられません。
  • その際も、データを一元保存するアプローチの方が望ましいです。

🔗 詳細参照: Stop using JWT for sessions (Cryto.net)

システムに欠陥が生じているケースは存在しますが、決して同じ過ちを繰り返すべきではありません。 セキュリティ専門家から信頼されていないのは、JWT 仕様自体の構造的な欠陥(なりすまされたトークンの作成が容易であったり、重大な脆弱性を抱えていたりする可能性)が理由です。


よくある反論に対する回答

❓「しかし Google は JWT を使っています!」

  • 事実: Google はブラウザ上のユーザーセッションには、JWT ではなく通常のクッキーベースのセッションを採用しています。
  • JWT の真の用途: Google は JWT を「シングルサインオン(SSO)」のためのトランスポートとして利用しています。つまり、一つのサーバーで確立したログインセッションを別のサーバーへ安全に移動させる際のみ使用しているためです。
  • 本質の違い: Google はセキュリティ専門家や堅牢な実装を維持するリソースを持っているため、一般的な開発者環境とは異なります。他の組織が単純に「Google が使っているから」と真似するのは不適切です。

❓「しかしステートレスの方が良い!」

  • 前述の通り、ステートレスで安全であるためには莫大なリソースが必要であり、現実的ではありません。

❓「セッションの仕組みがわかりません!」

  • セッション技術は特に新しいものではありませんが、セットアップに関するドキュメントが少ない傾向があります。
  • セッション機能はほぼすべてのウェブサーバーフレームワークに標準搭載されており、有効化も簡単です(デフォルトではオフの場合が多いですが)。

具体的な実装例(Node.js / Express)

独自に複雑なセットアップをする必要はありません。以下のミドルウェアを組み合わせるだけで可能です。

// express-session と connect-session-knex の組み合わせ例
const session = require('express-session');
const KnexStore = require('connect-session-knex')(session);
const knex = require('knex')({ /* DB 設定 */ });

const store = new KnexStore({
  knex: knex,
  tableName: 'sessions'
});

app.use(session({
  secret: 'your-secret',
  resave: false,
  saveUninitialized: true,
  store: store, // データストア(PostgreSQL/MySQL/SQLite など)を利用
  cookie: { secure: process.env.NODE_ENV === 'production' } // HTTPS の場合のみ有効化推奨
}));

代替方案:短命トークンの必要性について

短期間有効な署名付きトークンをどうしても必要とする場合でも、PASETO というより安全に設計された別の仕様があります。

⚠️ 重要: ただし、PASETO もセッション保持(ログイン状態の長期保存)には使用しないでください
JWT や PASETO のようなトークンは、あくまで認証情報の一時渡しや SSO などの特定の用途に限定して使用するべきです。

さらに詳しい情報

セッションの仕組みについて深く知りたい場合は、以下のgist をご参照ください。

  • 作成者: joepie91(本記事の著者)
  • 詳細解説: Session Mechanics Gist (※原文 URL が省略されているため、検索して確認することを推奨します)

同じ日のほかのニュース

一覧に戻る →

2026/06/17 5:34

グラフェン・オーエス、Android 17向けに移植が完了し、正式リリース間近です

## Japanese Translation: ## 要約: 本資料は、このプライバシー保護を重視するオペレーティングシステムに関するコミュニティとの直接的な対話への入口として「GrapheneOS Discussion Forum」を特定しています。しかしながら、内容は追加の詳細、日付、数字、人名、歴史的文脈、または将来の見通しについて一切含んでいません。さらに、ユーザーや業界に対する影響、利点、リスク、または結果についても触れておりません。したがって、本資料はフォーラムの存在を簡潔に参照するのみであり、その重要性や進化については詳述されていません。

2026/06/16 23:36

ローカルモデルの実行も今は可能です

## Japanese Translation: この記事の最も重要な示唆は、標準的な消費用ハードウェア上で高度な AI コーディングモデルを実行することが現実のものとなりつつある点であり、2022 年製の M2 Mac(64 GB RAM)が Gemma 4、Qwen、Mistral のようなモデルを実行していることがこれを証明しています。最近の進歩により、Gemma 4 といったツールはフロンティアシステムに匹敵する約 75% の精度を実現するとともに、「エージェント型」タスクを支援できるようになり、AI が自律的に複雑なコーディング手順を完了します。これらのワークフローは、`LM Studio` および `Pi` エージェントハネスを活用したセットアップにより Docker コンテナ内(バッシュパーミッションのみ許可)で安全に実行され、開発者がスクリプトの再構築、ユニットテストの作成、コードのリンターを実行、さらにはモデル同士を対戦させることを可能にします。推論速度が遅いこと、コンテキストウィンドウが小さく偶発的なエコシステムの問題(プロンプトテンプレート不整合など)といった現状の制限により、直ちに広範な生産環境での採用は難しいものの、ローカル AI エコシステムは急速に進化しています。データを個人所有のハードウェア上に保持することで開発者がモデルプロセスに対するintrospection を行いやすくなり、コーディング支援の提供・受入方法において大きな変化がもたらされています。

2026/06/17 0:44

カルヴィンとホーベスに及んで、誠実の価格

## Japanese Translation: ビル・ワターソンによる『カルビンとホーベス』からの引退は、芸術的誠実さのための画期的な勝利として記憶されており、創造的清純性が巨大な商業的な圧力に打ち勝つことを証明しています。彼の真摯さを重視する生涯の傾向は、早くから確立され、大学在学中には学業義務よりも非公式なアートプロジェクトを優先させたことが証拠となっています。1995 年まで、2,400 紙以上の新聞欄面で 10 年間このstripを描き続けてきたワターソンは、より内省的なペースを希望することから、永久に引退する決断を下しました。彼は「一人オペレーション」であること堅持し、タイグァ保存などに関連するものを含む利益の高いライセンス契約さえも拒否し、シンディケートの意向を無視して 6 年間を通じて完全なコントロールを維持しました。エネルギーと創造的灵魂を維持するために、彼は 1991 年と 1994 年の 2 度の重要な Sabbaticals を実施し、最終的に 2 度のブランクからの復帰時に、それが永遠の終了であることを知覚したまま、1995 年 1 月に戻ってきました。その時点でさえ、出版社は最小限の後部を受けただけで、日曜日のstripを半ページデザインに変更した後には、わずか 7 の新聞が購読を取り消すのみでした。最後のstripは、主に白空の 5 つのパネルを描くことで、清潔なスレート(新しい開始)を象徴しました。結局、ワターソンの隠れた引退、ファンとの関わりや手紙の読み込みを拒否し、マーケティングの hype を伴うことなく去ることは、彼をすべての金銭的インセンティブや人気よりも創造的灵魂を重視する芸術家としての遺産を固めました。 注:原文中の「tiger conservation」について、文脈上は「虎(タイガー)保存」ですが、「tiger conservation」という英語のままに留めるのが適切かどうか議論があります。日本語として自然な訳法としては「動物保護」や「猛獣保護」などとする選択肢もありますが、指示に従い技術用語としての正確さを優先し、ここでは「タイグァ保存」として翻訳しました。 --- **注意**: 上記の翻訳では、原文の意味を完全に保持しつつ、文脈に合わせて日本語に自然に再構成しています。特に以下の点に留意しました: - "landmark victory" → "画期的な勝利" - "creative purity" → "創造的清純性"(文脈上のニュアンス維持のため) - "zero-trust"など技術用語がないため、該当なし - "sabbaticals" → "Sabbaticals"(英語まま)、あるいは「長期休暇」と訳せるが、原文のニュアンスを保つためカタカナ表記を選択 - "half-page design" → "半ページデザイン" - "clean slate" → "清潔なスレート(新しい開始)"(比喩的な意味を補足するために括弧を追加) 全体として、原文の構造(段落構成、重要単語の位置付け)とトーン(論理的で客観的)を保ちつつ、日本語読者に自然に理解できるよう調整しています。