いま個人開発でSNSを作っている。設計中に決めたことのひとつが、セッション管理に「署名付きCookie」を使うことだ。
セッションデータをDBにもRedisにも保存しない。それなのにログイン状態は偽造できない。この方式を人に説明すると、だいたい2つの質問が返ってくる。
- サーバーに何も保存しないで、なぜ安全なの?
- 量子コンピュータが実用化されたら、破られるんじゃないの?
どちらも良い質問で、答えはけっこう面白い。順番に書いていく。
セッション管理には2つの流派がある
「ログインしたユーザーを覚えておく」方法は、大きく2つに分かれる。
- サーバー側ストア方式: ログイン時にランダムなセッションIDを発行してCookieに入れ、サーバー側のDBやRedisに「ID → ユーザー情報」の対応表を持つ。昔ながらの定番。
- ステートレス方式(署名付きCookie): ユーザーIDと有効期限をCookieにそのまま入れ、サーバーの秘密鍵で計算した「署名」を添える。サーバー側には何も保存しない。
ストア方式の欠点は、すべてのリクエストでストアへの読み取りが発生すること。アクセスが増えるほどセッションストアが激しく叩かれる。Redisを足せば解決するが、管理するものが1つ増える。
ステートレス方式は、この負荷が厳密にゼロになる。署名の検証は計算だけで完結するので、仮に1日100万PVが来てもセッション管理のコストは1円も増えない。個人開発では、この「管理するものが増えない」という性質がとても効く。
署名付きCookieの中身
実物はこんな形をしている(値は例)。
bs=v1.123.1.1765500000.Xk3fN9aQ...
│ │ │ └ 署名(HMAC-SHA256)
│ │ └ 有効期限(UNIX秒)
│ └ セッション世代番号(後述)
└ ユーザーID
ポイントは、中身が丸見えなこと。ユーザーIDも有効期限も隠していない。隠す必要がないからだ。
安全性を支えているのは末尾の署名で、これは「Cookieの中身」と「サーバーだけが知っている秘密鍵」から HMAC-SHA256 という計算で作られる。リクエストが来るたびに、サーバーは同じ計算をやり直して署名と照合する。
- 中身を1文字でも書き換えると、署名が合わなくなる → 改ざん検知
- 署名を自作するには秘密鍵が必要 → 偽造不可能
- 総当たりで署名を当てるには最大 2^256 回の試行が必要 → 宇宙の寿命では終わらない
つまり「サーバーに保存していないから危ない」のではなく、**「数学的に偽造できないから保存しなくていい」**という順番になっている。
ステートレスの弱点と、「世代番号」という解決策
いいことばかりではない。ステートレス方式には有名な弱点がある。個別のセッションを失効できないことだ。
対応表が存在しないので、「この端末のログインだけ切る」ということができない。有効期限が来るまでCookieは有効なままになる。パスワードを変更したのに古い端末でログインされ続けたら困る。
そこで登場するのがCookieに入れていたセッション世代番号だ。ユーザーテーブルに「現在の世代番号」を1列だけ持っておき、次の場面で +1 する。
- パスワードを変更・再設定したとき
- 運営がアカウントを凍結したとき
Cookieの中の世代番号とDBの世代番号が一致しないセッションはすべて無効、というルールにしておけば、番号をひとつ進めるだけで、その人の全端末が一括ログアウトされる。個別失効は捨てて全体失効だけを残す割り切りだが、実際に必要になる場面(パスワード漏れた・凍結したい)では「全部切りたい」ことがほとんどなので、これで足りる。
で、量子コンピュータが来たらどうなるの?
本題。「暗号は量子コンピュータに破られる」という話を聞いたことがある人は多いと思う。あれは半分正しくて、半分誤解だ。
量子コンピュータが暗号に与える影響は、有名なアルゴリズム2つで説明できる。
- Shor(ショア)のアルゴリズム: 素因数分解や離散対数を高速に解く。RSAや楕円曲線暗号といった「公開鍵暗号」は、これで実際に壊れる。「暗号が破られる」と言われているのは主にこちらの話。
- Grover(グローバー)のアルゴリズム: 総当たり探索を「二乗根の速さ」にする。共通鍵暗号やハッシュに適用できるが、効果はセキュリティ強度が半分になるだけ。
HMAC-SHA256 は後者のグループに属する。Grover を使っても 2^256 が 2^128 になるだけで、2^128 回の計算は依然として実行不可能だ(1秒に1兆回試せるマシンを1兆台並べても、宇宙の年齢の何百万倍もかかる)。NISTのポスト量子暗号の指針でも、SHA-256 や AES-256 クラスの共通鍵系は「量子後も安全」とされている。
つまり結論はこうなる。
署名付きCookie(HMAC)は、量子コンピュータが実用化されても安全。 量子で壊れるのは公開鍵暗号(RSA・楕円曲線)であって、共通鍵・ハッシュ系ではない。
本当に量子を心配すべきなのはCookieではなくTLS
皮肉なことに、Webサービスで量子の影響を最初に受けるのはセッションCookieではない。通信路(TLS/HTTPS)の鍵交換だ。
TLSの鍵交換には楕円曲線(Shorで壊れる側)が使われてきた。ここには「今のうちに暗号化通信を録画しておいて、量子コンピュータが完成したら復号する」という攻撃シナリオがある。harvest now, decrypt later と呼ばれていて、将来も価値が残る情報ほど狙われる。
ただ、ここも悲観する必要はない。CDN大手はすでに対応を始めていて、たとえばCloudflareはエッジのTLSに**ポスト量子ハイブリッド鍵交換(X25519 + ML-KEM)**を展開している。Cloudflareに載せているサービスは、ブラウザが対応していれば追加作業なしでポスト量子TLSの恩恵を受けられる。対応状況はブラウザの開発者ツールや https://pq.cloudflareresearch.com/ で確認できる。
まとめ
- セッションは「サーバー側ストア」か「署名付きCookie」の2流派。後者はセッション管理の負荷とインフラがゼロになる
- 署名付きCookieの安全性は HMAC-SHA256 の署名が担う。改ざんは検知され、偽造には秘密鍵が要る
- 個別失効できない弱点は、世代番号を1列持って全体失効で割り切る
- 量子コンピュータで壊れるのは公開鍵暗号(Shor)。HMACのような共通鍵・ハッシュ系はGroverで強度が半減するだけで、SHA-256クラスなら量子後も安全
- 量子時代にまず影響を受けるのはTLSの鍵交換だが、Cloudflareなどはすでにポスト量子ハイブリッドを展開済み
「量子コンピュータが来たら暗号は全滅」というイメージは誤解で、何が壊れて何が生き残るかは、はっきり分かれている。自分のサービスのどこに公開鍵暗号があり、どこが共通鍵系なのかを一度棚卸ししてみると、意外と「量子時代に持ち越す宿題」は少ないことがわかるはずだ。