---
# System prepended metadata

title: API を使ったログイン処理を実装する方法とログイン状態の維持の実装方法

---

# API を使ったログイン処理を実装する方法とログイン状態の維持の実装方法
APIを使用した認証方法はいくつか存在するが、今回はJWT認証について記述する
手順としては大まかに
1. JWTトークン生成
2. JWTトークン検証
3. ログイン状態の維持

がある

## トークン生成
1. フロントエンド側はユーザー・パスワードを送信
2. バックエンド側はユーザー・パスワードが正しいかを検証しユーザー情報取得
・DBにユーザー情報が保存されているか
・パスワードはハッシュ化しておく

3. ユーザー情報からpayloadを作成
・ユーザーIDなどが一般的
・payloadはデコードが容易なのでパスワードなどの機密情報は入れない

4. ハッシュ化するアルゴリズムなどの設定値を指定したヘッダーを作成
5. ヘッダー・payloadをBase64エンコードする(でコード可能)
6. 5の値をバックエンド側が保持している秘密鍵でハッシュ化・署名
7. 5の値(ヘッダー、payload)と6の署名を「.」でつなげたものがJWTトークンとなる

## トークン検証
1. フロントエンド側は生成されたJWTトークンをバックエンド側に送信
Authorizationヘッダーなどに入れるのが一般的

2. バックエンド側はヘッダー・payloadをデコードして、ユーザー情報・アルゴリズムなどの設定値を取得
3. 指定されたアルゴリズムを使って、ヘッダー・payloadからバックエンド側が保持している秘密鍵を使って署名を算出
4. 送信されてきたトークンの署名と一致していれば認証成功、デコードしたpayloadのユーザー情報が示すユーザーからのログインと判定

## ログイン状態の保持
トークン検証に成功したらログイン成功としてセッションが確立されるが、Webページはステートレスなので、ページが変わるとログアウトしてしまう。対処法としては

1. ログインに成功すると、セッション情報が暗号化されたクッキーが送られ、ブラウザ側で保持される。
2. ２回目以降アクセスする時は、リクエストと一緒にユーザの情報が乗ったクッキーと、サーバ側で保持した値がサーバへ送られる。
3. 送られたクッキーを復号化して セッション情報が存在していれば、ユーザを特定することができ、ログイン状態が維持される。
## JWTトークン認証は安全なのか
1. バックエンド側のみが保持する秘密鍵でハッシュ化するので改ざんを検知できる
ヘッダーやpayloadが改ざんされていたら署名が一致しない
2. 秘密鍵が十分に長ければ別の値(別のpayloadなど)から同じ署名を作れない
ブルートフォース攻撃で突破されない