1.Bearer認証とは
Bearer(ベアラー)とは英語で「所有者」という意味。
Bearer認証とは、認証トークン(アクセストークン)を「持っている人」に対して
アクセスを許可する方式。
(トークンを持っている人=正規の利用者として扱う仕組み)
もう少しわかりやすく言うと、
サーバー(入場ゲート)に接続するための「入館証」のイメージで
※トークン(入館証)を持っていれば、
サーバーへのアクセス(入場ゲートへの通過)が可能。
2.Bearer認証の基本的な構造
フロント側からAPIにリクエストする時、
HTTPヘッダーに下記内容で設定します。
Authorization: Bearer <アクセストークン>
※サーバーへのリクエスト例
GET /user/profile HTTP/1.1
Host: api.example.com
Authorization: Bearer abc123xyz456
Authorization: 認証情報を送るヘッダー
Bearer: 「入館証チェック」方式を使うよ、という宣言
abc123xyz456: 実際のアクセストークン
3.特徴(メリットと注意点)
メリット
- シンブルな認証方式:トークンを送信するだけで認証可能
- ステートレス(サーバー側でセッション情報を保持する必要がない)
- 多くのサービス(OAuth2、JWTなど)で標準的に使われている
注意点
- トークンを盗まれると不正利用される危険大
⇒HTTPS(暗号化通信)必須(盗聴のリスク回避のため)
⇒トークンには有効期限を設定を推奨
※推奨セキュリティ設定
- トークンの有効期限を短く設定する(通常15分〜1時間)
- リフレッシュトークンと組み合わせる
- HTTPS通信を必須にする
- 適切な場所にトークンを保存する(localStorageではなく、httpOnlyなCookieなど)
4.Bearer認証処理の流れ
5.実装例(Node.js+Express)
// インストール
// npm init -y
// npm install express
const express = require("express");
const app = express();
// サーバー側で決め打ちしたアクセストークン(例)
const ACCESS_TOKEN = "abc123xyz456";
// 保護されたAPIエンドポイント
app.get("/profile", (req, res) => {
// Authorizationヘッダーを取得
const authHeader = req.headers["authorization"];
if (!authHeader) {
return res.status(401).json({ message: "認証情報がありません" });
}
// "Bearer <token>" の形式を確認
const [scheme, token] = authHeader.split(" ");
if (scheme !== "Bearer" || token !== ACCESS_TOKEN) {
return res.status(403).json({ message: "トークンが無効です" });
}
// トークンが一致すればアクセス許可
res.json({
message: "認証成功!",
user: {
id: 123,
name: "Shuumei",
role: "admin",
},
});
});
// サーバー起動
app.listen(3000, () => {
console.log("Server running at http://localhost:3000");
});
📌 動作確認
■サーバー起動
node index.js
■正しいトークンでアクセス
curl -H "Authorization: Bearer abc123xyz456" http://localhost:3000/profile
✅ レスポンス例
{
"message": "認証成功!",
"user": {
"id": 123,
"name": "Shuumei",
"role": "admin"
}
}
■トークン無しでアクセス
curl http://localhost:3000/profile
❌ レスポンス
{
"message": "認証情報がありません"
}
6.まとめ
以前、UdemyでBearer認証を使っていた講座があって、
何となく使っていたのですが、
本記事で具体的な仕組みとメリット・デメリットも理解出来たので、
JWT、HttpOnlyなどセキュリティに関わるところを
もっと深堀りしたいです。