セッションIDとCSRFトークンって?

一般的なセッションベースの認証方式では、ユーザーの認証用に使うIDとしてセッションIDとCSRFトークンというものを発行します。
どちらも、
- 予測しにくい文字の羅列である
- サーバーで発行し、ユーザーと紐づけてDBに保存する
- サーバーがクライアントに送り、クライアントではCookieなどに保存する
という点が共通です。
違う点は、
- セッションID:一つのセッションで同じIDで、ログイン時に発行されたリクエストがセッションが切れるまで使用される。またリクエストのたびに自動的にセットされる。
- CSRFトークン:リクエストごとに違うID。また、自動的にセットされないので、リクエストを送る側が明示的にリクエストヘッダーなどにセットしないといけない。
です。
セッションIDはログインしてる間は常にリクエストに入ってしまうのでクロスサイトフォージェリに脆弱。
CSRFトークンは明示的にセットしないといけないけど、そのおかげでそもそもリクエストを送る側が同ドメインじゃないといけないので(Cookieにアクセスできるということは同ドメインということ)、同ドメインかどうかをチェックできて安全。
ということです。
素人目ではCSRFトークンをセッションIDとしても使うのはダメなのかな?と思うんですけど、
- リクエストごとにセットするのは大変
- セッションIDだけでも、CSRFの対象になりにくい処理はある(DBに影響しない、読み取り専用のGETリクエストなど)
あたりの理由で、セッションIDとCSRFトークンは別々に作って、ここぞというときだけCSRFトークンが使われるのが一般的みたいです。