[SpringBoot]はCSR方式で応答する.sendRedirect()を使用する際の注意点


問題が発生


ローカルテスト時に全く問題のないログイン機能がAWSに配備されると動作しなくなります.クライアントは、404も応答もないエラー・ログをチェックし、Postmanを使用してテストを行うと、ドメイン127.0.0.1が要求され、ローカル・ホストに接続できないという不思議なエラーが発生しました.サーバをローカルで実行し、Postmanにリクエストを送信した場合、ローカルリクエストによってエラーは発生しません.
Redisは問題だと思いますので、コントローラのテストをしました.結果はよかったです.ログでログインが正常に行われていることを確認し、ローカル環境にリクエストを送信する部分があると思い、Spring Securityのログインプロセスを再確認し、不審な部分を発見しました.即座に応答する.sendRedirectです

の原因となる

// 문제의 코드
@Component
class CustomAuthenticationFailureHandler : AuthenticationFailureHandler{
    override fun onAuthenticationFailure(
        request: HttpServletRequest?,
        response: HttpServletResponse?,
        exception: AuthenticationException?
    ) {
        println(exception?.message)
        response?.sendRedirect("http://localhost:8080/api/login/fail")
    }
}
Spring Securityが提供するログインポリシーは、ログインの実装時に使用されるため、フィルタレベルで要求をJWTトークンにマウントしてクライアントに送信する必要がありますが、Brite Req、Resは不明なため、トークンを返すコントローラを作成して応答します.sendRedirect()で生成されたトークンをクエリーに入れ、コントローラとして再起動します.問題はsendRedirectメソッドがクライアントにリダイレクトアドレスを送信し、サーバを再要求する方法で動作することです.

すなわち、サーバ内のリクエスト処理コントローラに直接送信するのではなく、クライアントからリクエストを受信して再送信するため、localhostは、EC 2サーバではなくクライアントのドメインを表すため、リクエストはローカルに送信される.

解決する


最終的にlocalhostセクションをEC 2サーバのIPアドレスに変更することで問題を解決します.この問題では、いろいろな方法を試してみましたが、最終的にはある程度、もっと勉強する必要があると思います.