ホームページ  >  記事  >  バックエンド開発  >  HTTP ミドルウェアはどのようにして Golang で WebSocket 接続を保護できますか?

HTTP ミドルウェアはどのようにして Golang で WebSocket 接続を保護できますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-02 07:54:02750ブラウズ

How Can HTTP Middleware Secure WebSocket Connections in Golang?

HTTP ミドルウェアによる WebSocket 接続の認証

WebSocket 接続は、クライアントとサーバー間のリアルタイム通信の手段を提供します。ただし、HTTP リクエストとは異なり、WebSocket は本質的に認可や認証をサポートしません。これに対処するために、HTTP ミドルウェアを使用して WebSocket 接続を保護できます。

問題ステートメント

一般的なアプローチの 1 つは、HTTP を認証するためのアプリケーションのコードを使用してアップグレード ハンドシェイクを認証することです。リクエスト。ただし、Gorilla の WebSocket アップグレーダーを使用して Golang でこのアプローチを実装するのは困難であることがわかっています。

コミュニティからの提案

コミュニティからの提案には次のものがあります。

  • Check接続が確立された後のユーザー名とパスワード (非慣用的)

失敗した戦略

失敗した戦略には、カスタム ヘッダー (「X-Api」の追加が含まれていました) -Key") を最初の HTTP GET リクエストに追加し、一致するキーを持つクライアントのみをアップグレードします。ただし、これにより、サーバー上で「アップグレード」トークンが見つからないというエラーが発生し、クライアントが WebSocket プロトコルを利用できなくなりました。

戦略 1 の改善されたソリューション

戦略 1 を改善すると、認証は WebSocket ハンドシェイク自体で実行される必要があります。これは、クライアント コードで認証ヘッダーを Dial の最後の引数として渡すことで実現できます。

<br>func main() {</p><pre class="brush:php;toolbar:false">u := url.URL{Scheme: "ws", Host: "localhost:8080", Path: "/ws"}
headers := http.Header{"X-Api-Key": []string{"test_api_key"}}
conn, _, err := websocket.DefaultDialer.Dial(u.String(), headers)
if err != nil {
    log.Fatalf("dial err: %v", err)
}

}

サーバー側では、ハンドシェイク プロセス中に HTTP リクエストを認証するためのアプリケーションの既存のコードを使用して認証を実行する必要があります。これにより、クライアントが承認されている場合にのみ WebSocket 接続が確立されるようになります。

以上がHTTP ミドルウェアはどのようにして Golang で WebSocket 接続を保護できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。