🦁

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

2024/04/08に公開

目的

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

ログイン認証

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

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

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

cookieもJWTも使わない場合

メリット

  • なし

デメリット

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

JWTのみを使う場合

メリット

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

デメリット

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

cookieのみを使う場合

*補足

cookieの中身

  • 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とJWTのみを使う場合

メリット

  • セッションハイジャックが起こりにくい
    • 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ブラウザを切ってもセッションが消えるかどうか

Discussion