🦁
Webアプリケーションで考えるJWT認証とcookie認証によるベストプラクティス
目的
自分で認証ありのサイトを作るために勉強していたところ、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 で不一致によるエラーが起こる。 | 楽 |
Discussion