はじめに
普段SNSや決済アプリ等を使用している時に、不意に再度ログインを求められる事ありませんか?
私はそんな時いつも「ログインするの面倒だな〜」「ずっとログイン状態で良いのに」と思っています。
そもそもどうやってログイン状態を保持しているのかをきちんと理解出来ていなかったので、そちらについて今回調査してみました!
間違いなどあれば忌憚なくご意見いただきたいです!
ログイン状態を保持される仕組み
調べていると主に2つの認証方法がありました。
セッション認証とトークン認証という2つのやり方がありました。
これからそれら2つについて詳しく説明させていただきます!
1. セッション認証
セッション認証とは、ユーザーが一度ログインすると、そのログイン状態をサーバー側で保持し、一定期間その状態を維持する仕組みの事です。
処理の流れ
1.ログイン時にセッションIDを発行
ユーザーがログインをする際に、サーバーはユーザーに一意のセッションIDを作成します。
作成されたセッションIDはサーバー側に保存され、ユーザーのログイン状態やユーザー情報の追跡に使用します。
2.クライアント側にセッションIDを保持
作成されたセッションIDは、cookieとしてユーザーのブラウザに保存されます。
セッションIDには直接的なユーザー情報やログイン情報は含まれてません。
3.次回のリクエストでセッションIDを送信
ユーザーがアプリを開いたり、別ページに遷移する際のリクエストにセッションIDを含めます。
これによりサーバーはセッションIDを受け取り、ユーザー情報をユーザーにレスポンスします。
4.セッションの維持
これらのセッションIDが有効な間は、ユーザーログイン状態は保持され続けます。
2. トークン認証
トークン認証とは、ユーザーの認証情報をトークンとして管理する仕組みのことです。
REST APIやモバイルアプリで特に使用される認証方式です。
処理の流れ
1.ログイン時にアクセストークンの発行
ユーザーがログインすると、サーバーはそのユーザーに対してアクセストークンを発行します。
このアクセストークンは、ユーザーが認証済みであることを証明する一時的な鍵のようなものです。
2.アクセストークンの保存
アクセストークンはクライアント側(ブラウザやモバイルアプリ)に保存されます。
通常、トークンはローカルストレージ、またはセキュアストレージに保存されます。
3.リクエスト時にトークンを送信
ユーザーがサーバーにアクセスするたび、クライアントはこのアクセストークンをサーバーに送信します。サーバー側でそのトークンが有効であれば、ユーザーのリクエストを処理します。
4.トークンの期限切れとリフレッシュトークン
アクセストークンは通常短い有効期限を持っており、一定期間が経過すると期限が切れます。
しかし、ユーザーに再度ログインを要求しないために、リフレッシュトークンが併用されます。
リフレッシュトークンはアクセストークンよりも長い有効期限を持ち、アクセストークンの期限が切れた際に、サーバーに新しいアクセストークンを発行してもらうために使用します。
3. セッション認証とトークン認証の違い
ここまで話を聞いていると「あれ?セッション認証とトークン認証ってやってること一緒じゃない?」という疑問を抱く方が出てくると思います。
2つの大きな違いとしましては、ユーザー情報の紐付けが行われているかです。
まず、セッションIDは、ユーザー情報と紐付けが行われています。
その為、紐付けされているユーザー情報を基に、そのユーザーがアクセス可能なリソースなのか判断を行っています。
つまり、サーバーでユーザー情報を保持する必要があるということです。
一方で、アクセストークンは、ユーザー情報と紐付けが行われていません。
サーバーでは「~~というトークンなら、~~というリソースにアクセス可能」ということを事前に決めており、届いたアクセストークンを基に判断しているだけです。
つまり、サーバーでユーザー情報を保持する必要がないということです。
まとめ
セッション認証はステートフルな通信であり、トークン認証はステートレスな通信である。
セッション認証では、サーバーにセッションIDとユーザー情報を持たせておく必要があります。
その為、ユーザー数が増加することでサーバーの負荷が増加します。
一方で、トークン認証はトークンによる認証のみを行うので、サーバーにセッション認証のように情報を持つ必要がありません。
その為、ユーザー数が増加した際もサーバーの負荷が少なく済みます。