はじめに
前回の記事では、Golang EchoフレームワークでJWT認証を実装する方法
について解説しました。
今回は、このアプリケーションにCSRF(Cross-Site Request Forgery)対策を追加し、セキュリティをさらに強化する方法を紹介します。
CSRFとは?
CSRF(クロスサイトリクエストフォージェリ) は、ユーザーが意図しないリクエストを第三者が送信させる攻撃手法です。
これを防ぐために、CSRFトークン を用いてリクエストの正当性を検証します。
追加する機能の概要
- CSRFミドルウェアの設定
- CSRFトークン取得用エンドポイントの追加
- クライアント側でのトークン送信
1. CSRFミドルウェアの設定
EchoにはCSRF対策用のミドルウェアが用意されています。server.go
に以下の設定を追加します。
import (
// 既存のインポートに加えて
"github.com/labstack/echo/v4/middleware"
)
func main() {
// 既存のコード...
// CSRFミドルウェアの設定
csrfConfig := middleware.CSRFConfig{
TokenLookup: "header:X-CSRF-Token", // ヘッダーからトークンを取得
CookieName: "csrf_token", // クッキー名
Secure: false, // HTTPS使用時はtrue
}
e.Use(middleware.CSRFWithConfig(csrfConfig))
// 既存のルート設定...
}
2. CSRFトークン取得用エンドポイントの追加
クライアントがCSRFトークンを取得できるように、エンドポイントを追加します。
// CSRFトークンを取得するハンドラー
func getCSRFToken(c echo.Context) error {
csrfToken := c.Get(middleware.DefaultCSRFConfig.ContextKey).(string)
return c.JSON(http.StatusOK, echo.Map{
"csrf_token": csrfToken,
})
}
func main() {
// 既存のコード...
// CSRFトークン取得エンドポイント
e.GET("/csrf", getCSRFToken)
// 既存のルート設定...
}
3. クライアント側でのトークン送信
クライアントは、/csrf
エンドポイントから取得したトークンを、後続のリクエストヘッダーに含めて送信します。
// CSRFトークンの取得
async function getCSRFToken() {
const response = await fetch('/csrf', {
method: 'GET',
credentials: 'include',
});
const data = await response.json();
return data.csrf_token;
}
// トークンを含めたリクエスト
async function createUser(userData, jwtToken) {
const csrfToken = await getCSRFToken();
const response = await fetch('/users', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRF-Token': csrfToken,
'Authorization': `Bearer ${jwtToken}`,
},
body: JSON.stringify(userData),
});
return await response.json();
}
動作確認
-
サーバーの起動
go run server.go
-
CSRFトークンの取得
curl -X GET http://localhost:1323/csrf -c cookies.txt
-
CSRFトークンを使用してログイン
curl -X POST http://localhost:1323/login \ -H "Content-Type: application/json" \ -H "X-CSRF-Token: YOUR_CSRF_TOKEN" \ -b cookies.txt \ -d '{"email":"user@example.com","password":"password"}'
-
保護されたエンドポイントへのアクセス
curl -X POST http://localhost:1323/users \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_JWT_TOKEN" \ -H "X-CSRF-Token: YOUR_CSRF_TOKEN" \ -b cookies.txt \ -d '{"name":"Jane Doe","email":"jane@example.com","password":"securepassword"}'
注意点:
-
-c cookies.txt
はクッキーを保存します -
-b cookies.txt
は保存したクッキーを送信します -
YOUR_CSRF_TOKEN
は手順2で取得したトークンに置き換えてください -
YOUR_JWT_TOKEN
は手順3で取得したJWTトークンに置き換えてください
正常にユーザーが作成されれば、CSRF対策とJWT認証の両方が正しく機能していることを確認できます。エラーが発生した場合は、トークンが正しく設定されているか確認してください。
まとめ
今回、Go Echoを使用したJWT認証アプリケーションにCSRF対策を追加する方法を紹介しました。
EchoのCSRFミドルウェアを活用することで、簡単にセキュリティを強化できます。
セキュリティは継続的に見直すことが重要ですので、他の対策も併せて検討しましょう。