🦁
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