🦁

Webアプリケーションで考えるJWT認証とcookie認証によるベストプラクティス

2024/04/08に公開

目的

自分で認証ありのサイトを作るために勉強していたところ、cookie と JWT を組み合わせた認証のサイトを良く見かけた。自分は、coolkie、jwt 単独で使わず、2 つを組み合わせて使う理由が気になったことがきっかけである。

ログイン認証

今回は、cookie と jwt を組み合わせたログイン認証(一番安全でポピュラー)を行う。そこで

  • cookie も jwt を使わない場合
  • jwt のみを使う場合
  • cookie のみを使う場合
  • cookie と jwt を組み合わせた場合

を比べることで、cookie と jwt を組み合わせたログイン認証が一番安全でポピュラーである理由を知る

メリット

  • なし

デメリット

  • client と server 間の通信を盗聴されたら、一発でアウトである. 盗まれた id でそれに紐づくユーザ情報を全て server から取得できてしまう

JWT のみを使う場合

メリット

  • 柔軟(独自)に機能を設定できる(例えば、17~18 時のみアクセスできるように、safetime という属性を設定する

デメリット

  • JWT は機能が豊富で範囲が広いため、ライブラリの作者またはユーザーのどちらかが間違いを犯す可能性が高くなる。(自分たちでルールを決めれるため、server と client で処理の違いによりエラーを引き起こす可能性がある。)
  • JWT はデータの容量が大きい(機能を増やすほど重くなる)
  • JWT は自己完結しており、それらを無効にする中央機関がないため、セッションの終了時に JWT を削除することができないこと

*補足

  • name (value に対する名前、今回で言うと"id")
  • value  (server と共有したい数値、文字列、今回で言うと id の値)
  • expire (cookie の使用期限、期限を過ぎると cookie は無効に)
  • path (クッキーが送信されるパスをルート。例えば、「/dashbord」設定すると https:xxx/dashbord のみで cookie が送信される。つまり https:xxx/top では送信されない。サイト全体で使用したければ、「/」に設定)
  • domain(特定のドメインにクッキーを紐付け,server の url を記載)
  • secure (true の場合、server と client 間が HTTPS 通信(暗号化通信)のみを許可,基本的に true)
  • HttpOnly  (true の場合、javascript で読み取れない、基本的に true)

メリット

  • JWT よりも容量が小さい
  • cookie による型が決まっている(ルールが決まっている)ため、client と server 側で処理が異なってエラーが起こることはない。
  • 有効期限が決まっている。
  • sevure や HttpOnly などでセキュリティを高めることができる

デメリット

  • セッションハイジャックが起こる
    • cookie の value の中身は暗号化されていないため予測できてしまうため、簡単な数字などで予測され、同じ cookie を再現できてしまう。
    • cookei の  value の中身は、変わらない(不変)のため複雑な文字列、数字だとしても盗まれる可能性がある。(時間かければいける可能性あり)

*セッションハイジャックとは、先述した Web サイトのセッションを乗っ取る(ハイジャックする)行為だ。セッションを乗っ取ることで、攻撃者は別のユーザーになりすましての通信が可能となる。

メリット

  • セッションハイジャックが起こりにくい
    • cookie の value の中身は暗号化されているため予想は不可能
    • cookie が生成されるたびに新しい暗号となる
  • 軽量
    • jwt を暗号化するものを id のみで良いため軽量
    • cookie を使っているためさらに軽量
  • 設計によるミスが起きにくい
    • cookie による型が決まっている(ルールが決まっている)ため、client と server 側で処理が異なってエラーが起こることはない。

デメリット

  • 無し

まとめ

cookie、jwt あり cookie のみ jwt のみ どちらもなし
セキュリティ 暗号化されているため安全 通信は暗号化されているが、中身自体は暗号化されていないため少し危険 暗号化されているため安全 暗号化されていないため危険
容量(コスト) cookie 利用と cookie の機能提供による jwt の簡素化により軽量 cookie 使用のため軽量 機能が増えるごとに容量が増える 軽量
設計 cookie により型が決まっているため、server と client で不一致起こりにくい。 cookie により型が決まっているため、server と client で不一致起こりにくい。 柔軟に機能を設定できるため、server と client で不一致によるエラーが起こる。

終わり

次は scrf token 編

scrf token を設定するのは scrf 対策だけでない

scrf token を設定するとどのタイミングでセッションが切れるかを決める!!

新しい tab を生成したらセッションが切れるかどうか

ページが遷移したらセッションが切れるかどうか

web ブラウザを切ってもセッションが消えるかどうか

GitHubで編集を提案

Discussion