なぜセッションが必要なの?
HTTPはステートレス(状態を持たない)プロトコルだから、リクエストごとに「誰がアクセスしているか」がわからない。ログイン後にセッションID(ランダムな文字列)をCookieに設定し、サーバー側でセッションIDとユーザー情報を紐付けることで「この人はログイン済み」と判定するんだよ
セッションハイジャックって何?
他人のセッションIDを盗んで「なりすまし」をする攻撃。盗む方法は①XSS攻撃でCookieを抜き取る、②通信の盗聴(HTTPだとセッションIDが平文)、③セッション固定攻撃(攻撃者が設定したセッションIDでログインさせる)。対策はSecure/HttpOnly属性のCookie、HTTPS強制、ログイン時のセッションID再生成だよ
JWTとセッションの違いは?
セッションはサーバー側に状態を保持(ステートフル)。JWTはトークン自体にユーザー情報を含む(ステートレス)。セッションはサーバーのメモリやRedisが必要だけど即座に無効化できる。JWTはサーバー負荷が少ないけど有効期限前の無効化が難しい。マイクロサービスではJWT、モノリスではセッションが多いよ
安全な実装のポイントは?
①セッションIDは暗号学的に安全な乱数で生成(予測不可能に)、②Cookie属性はSecure、HttpOnly、SameSite=Lax/Strictを設定、③ログイン成功時にセッションIDを再生成(固定攻撃防止)、④適切なタイムアウト(30分無操作で失効等)、⑤ログアウト時にサーバー側でもセッションを破棄。フレームワークの機能を使うのが最も安全だよ