エンジニアになって1〜2年目のあなた、「JWT」という言葉を見かけたことはありますか?実はこれ、「ジェイ・ダブリュー・ティー」と読んだり、「ジョット」と読んだりします。「セッション」や「クッキー」、「IDトークン」なんて言葉も出てきて、なんだか混乱しますよね。
この記事では、そんなあなたにJWTをすっきり理解してもらえるよう、分かりやすく、身近な例を交えながら説明していきます。
JWTってそもそも何?
JWTは「JSON Web Token」の略。ざっくり言うと、「ログイン後のユーザー情報を安全にやり取りするための仕組み」です。
JWTのメリットや特徴を知るには、まず「セッション認証」という方法を理解するのが近道です。
認証を実装する2つの方法
認証の方法は、大きく分けて2種類あります。
1. セッション認証(クッキーを使った認証)
セッション認証は、レストランで順番待ちの札をもらうイメージです。お店(サーバー)はその番号にあなたの情報をひも付けて覚えています。順番が来たら、その番号を呼んで案内してくれる。つまり、札(クッキー)は目印にすぎず、本当の情報はすべてお店側(サーバー)が持っています。
- メリット
- 情報をサーバーで管理するので安全性が高め
- ユーザー管理が直感的でシンプル
- デメリット
- ユーザー数が増えるとサーバーの負荷が高まる
- 複数サーバー間でセッション情報を共有しにくい
2. JWT認証(トークンを使った認証)
一方、JWT認証はフードコートでのセルフオーダーに近いです。注文を済ませると、番号が書かれたレシートをもらえます。そのレシートを持っていれば、どのカウンターでも「この人の注文はこれだ」と判断して料理を出してくれる。注文内容(ユーザー情報)はレシート(JWT)に含まれているので、カウンター(サーバー)は記録を持っていなくても問題ないわけです。
- メリット
- サーバーの負担が軽くなる(情報をサーバー側で保持しない)
- 複数サーバーやマイクロサービスとの連携が簡単
- デメリット
- トークンを管理したり無効化したりするのが少し難しい
- クライアント側で保管するため、安全に扱う必要がある
IDトークンとは何が違う?
ところで、「IDトークン」という言葉を聞いたことはありますか?実はIDトークンもJWTの一種で、GoogleやLINEなどのソーシャルログインで使われます。JWTという広いカテゴリの中で、「この人が誰なのか」という情報だけをシンプルに持ったトークン、それがIDトークンです。
JWTはなぜ改ざんされないの?
JWTの最大の特徴は「改ざん防止」です。JWTには「署名(Signature)」という仕組みがあり、これがあなたの情報を守ります。署名はサーバーが秘密の鍵で作った「印鑑」のようなもの。もし誰かが勝手に情報を書き換えたら、この印鑑が合わなくなってしまうので、サーバーがすぐに気付きます。
つまり、署名によって「このトークンは本当にサーバーが作ったものなのか」「内容は改ざんされていないか」を簡単に確かめられるようになっています。
JWTの中身を少しだけ見てみよう
JWTは次の3つのパートに分かれています。
- ヘッダー(Header)
JWTの種類や使っているアルゴリズムを示します。 - ペイロード(Payload)
ユーザーのIDやトークンの有効期限などの情報を持ちます。 - 署名(Signature)
上の2つが正しいことを証明する印鑑のようなものです。
これらは.(ドット)でつながって、一つの文字列になります。
JWTをもっと理解するための便利ツール
JWTの中身を自分で覗いてみたいと思ったら、「Toolpods」という便利なウェブサイトがあります。このサイトでは、JWTを貼り付けるだけで簡単にデコード(中身の確認)ができます。実際にトークンをデコードして、中身を見てみると理解がさらに深まりますよ。ちなみに自作です(宣伝)。
試しに下記のトークンをデコードしてみましょう。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6MTUxNjIzOTAyMn0.KMUFsIDTnFmyG3nMiGM6H9FNFUROf3wh7SmqJp-QV30
JWTの使い方に関する注意点
JWTは便利ですが、扱いに注意も必要です。
- 絶対にパスワードなどの秘密情報はJWTに入れないこと。
- トークンの有効期限は短く設定し、安全性を高めることが大切です。
まとめ
認証を実装するときは、「セッション認証」と「JWT認証」それぞれの特徴をよく理解して、状況に最適な方法を選びましょう。JWTは現代的で柔軟な認証方法ですが、その特性を理解して正しく使うことが重要です。
この記事があなたのJWT理解を助けるヒントになれば嬉しいです。ぜひ実際のプロジェクトで役立ててみてくださいね!