付録F アクセストークン と リフレッシュトークン — ログインの「証明書」のしくみ

📖 このページのゴール:第2章で出てきた「ログインの証明書(トークン)」を、もう一歩だけ深掘りします。読み終わると、なぜトークンが2種類あるのか、そしてそれぞれが何のためにあるのかが、たとえ話でスッキリ分かります。

← 目次・はじめにへもどる


🤔 2種類のトークン

🟢 第2章で「ログイン状態=ブラウザに保存される証明書(トークン)」というお話をしましたね。じつは、その「証明書」は1枚ではなく2枚セットで動いています。

  • アクセストークン
    • 短命です。発行されてから数十分で期限切れになります。
    • 毎回のリクエストに添えて「私は本人ですよ」と示すために使います。
    • これが第5章で出てきた Authorization: Bearer <トークン> の正体です。サーバーに「誰が叩いたか」を伝えるのが役目。
  • リフレッシュトークン
    • 長命です。ずっと長く使えます。
    • アクセストークンが切れたとき、「新しいアクセストークンをください」と引き換えるためのです。
    • ふだんのリクエストには添えません。更新のときだけそっと使われます。

つまり、短命の券で毎回名乗り長命の券で裏でこっそり更新し続ける——この2枚体制で「ログインしっぱなし」の状態が保たれているのです。


🎟️ なぜ2種類あるの?

🟢 「1枚で十分じゃないの?」と思いますよね。ここに、安全さ快適さを両立させる工夫があります。

もしトークンを1枚だけにして、しかも長命にしたとします。すると、その1枚が万一盗まれたとき、犯人は長いあいだ本人になりすませてしまいます。とても危険です。

逆に1枚だけで短命にすると、盗まれても被害は小さい……のですが、今度は数十分ごとにログインし直すことになり、とても面倒です。

そこで「2種類」の出番です。

  • アクセストークンは短命にする → 万一漏れても、すぐ無効になるので被害が小さい。
  • でも毎回ログインし直すのは面倒 → そこで長命のリフレッシュトークンが、裏で自動的に新しいアクセストークンを取ってきてくれる。

これで「漏れても安心」と「ログインしっぱなしで快適」を両方とも手に入れられます。

そして嬉しいことに、この更新作業は Supabase が自動でやってくれます。あなたが「期限が切れそうだから更新して……」というコードを書く必要はありません。

🎟️ たとえ話 アクセストークン=遊園地の「1日券」。便利だけど、その日のうちに使えなくなる(=短命)。 リフレッシュトークン=「年間パスポート(会員証)」。これを窓口で見せれば、毎日あたらしい1日券を再発行してもらえる(=長命)。 ふだん遊ぶときに見せるのは1日券のほう。会員証は再発行のときだけ出す、というわけです。


🔧 中身(JWT)

🔧 アクセストークンの多くは、JWT(ジェイ・ダブリュー・ティー) という形式でできています。「JSON Web Token」の略です。

JWTの中には、たとえばこんな情報が入っています。

  • ユーザーID(誰の券か)
  • 有効期限(いつまで使えるか)

そして大事なのが、JWTには 署名(しょめい) がついていること。これは、発行元(Supabase)だけが付けられる「本物の印」のようなものです。

この署名のおかげで、中身が書き換えられていないか(改ざんされていないか)をサーバーが検知できます。

ポイントは次の一言に集約されます。

JWTの中身は 「読める」が「書き換えられない」

誰でも中身を読むことはできます。でも、ほんの1文字でも書き換えると署名が合わなくなり、サーバーに「これは偽物だ」とバレるのです。だからパスワードのような秘密はJWTに入れません(読めてしまうため)。

見た目は eyJhbG... のような、意味不明なアルファベットと数字の長い文字列です。これは base64 という方式でエンコード(変換)されているだけで、暗号化された秘密ではありません。あくまで「読めるが、書き換えられない」データだと覚えておきましょう。


⚠️ 注意(漏れたら)

トークンは「ログインの証明書」そのものなので、他人に渡ること=なりすましにつながります。とくに次の点に気をつけましょう。

  • リフレッシュトークンの窃取は、長期のなりすましにつながります。長命なぶん、盗まれたときの被害も大きいのです。だからこそ、安全に保管したり、後から失効させたりする仕組みが必要になります。
  • トークンをURLやログ(記録)に出さないこと。URLは履歴やサーバーログに残りがちで、そこから漏れます。
  • ブラウザの localStorage に保管する場合は XSS(クロスサイトスクリプティング)に注意。悪意あるスクリプトが紛れ込むと、保管したトークンを盗み出されることがあります(第2章・第10章を参照)。
  • ログアウトとは、トークンを「失効(revoke)」させることです。ただ画面を閉じるだけでは券は生きたまま。きちんと失効させて、券を「無効」にしてもらいましょう。

これらの多くも Supabase 側がよしなに扱ってくれますが、「証明書を雑に扱わない」という意識は、開発者として持っておきたいところです。


📝 ことばメモ

  • アクセストークン:毎回のリクエストに添えて「私は本人」と示す、短命の券。Authorization: Bearer <…> で使う。
  • リフレッシュトークン:アクセストークンが切れたとき新しいものと引き換える、長命の券。
  • JWT(ジェイ・ダブリュー・ティー):ユーザーIDや有効期限などを入れた、署名つきのトークン形式。中身は読めるが書き換えられない。
  • 署名:発行元だけが付けられる「本物の印」。改ざんを検知するためのもの。
  • 失効(revoke):トークンを「もう無効」にすること。ログアウトの正体。
  • 有効期限(expiry):そのトークンがいつまで使えるかの期限。アクセストークンは短く、リフレッシュトークンは長い。

関連ページ:トークンの入口第2章、実際の使われ方第5章事故と対策第10章 を見てみましょう。

← 目次・はじめにへもどる