1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Go Echo】CSRF対策 + JWT認証

Last updated at Posted at 2024-11-09

はじめに

前回の記事では、Golang EchoフレームワークでJWT認証を実装する方法
について解説しました。

今回は、このアプリケーションにCSRF(Cross-Site Request Forgery)対策を追加し、セキュリティをさらに強化する方法を紹介します。

CSRFとは?

CSRF(クロスサイトリクエストフォージェリ) は、ユーザーが意図しないリクエストを第三者が送信させる攻撃手法です。

これを防ぐために、CSRFトークン を用いてリクエストの正当性を検証します。

追加する機能の概要

  1. CSRFミドルウェアの設定
  2. CSRFトークン取得用エンドポイントの追加
  3. クライアント側でのトークン送信

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();
}

動作確認

  1. サーバーの起動

    go run server.go
    
  2. CSRFトークンの取得

    curl -X GET http://localhost:1323/csrf -c cookies.txt
    
  3. 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"}'
    
  4. 保護されたエンドポイントへのアクセス

    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ミドルウェアを活用することで、簡単にセキュリティを強化できます。
セキュリティは継続的に見直すことが重要ですので、他の対策も併せて検討しましょう。

関連リンク

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?