付録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):そのトークンがいつまで使えるかの期限。アクセストークンは短く、リフレッシュトークンは長い。