Spring Boot および React アプリの CORS エラーについて
を使用してWebアプリケーションを開発する場合、 反応する フロントエンドと スプリングブーツ バックエンドの場合、開発者が直面する一般的な問題は、悪名高い CORS エラーです。このエラーは、セキュリティ上の理由によりブラウザーがリクエストをブロックした場合、特に別のポートまたはドメインでホストされているバックエンド サービスに接続しようとした場合に発生します。この場合、作成中に CORS の問題に対処していることになります。 GETリクエスト React から Spring Boot API へ。
エラー メッセージは通常、ブラウザがリクエストをブロックしていることを示します。 アクセス制御許可オリジン ヘッダーが欠落しているか、正しく構成されていません。注目に値するのは、次のようなツールです。 郵便屋さん これらのセキュリティ制限を強制しないでください。そのため、リクエストは Postman では完全に機能しても、ブラウザでは失敗する可能性があります。
このシナリオでは、エラー メッセージは、プリフライト要求がアクセス制御チェックに合格しないことを示しています。これは通常、特定のヘッダーまたはメソッドが許可されていないか、サーバーの CORS ポリシーで適切に構成されていない場合に発生します。 CORS 構成はサーバー側で適切に行われているように見えますが、ブラウザー要求の処理方法に特有の問題がある可能性があります。
この記事は、問題の根本原因を理解し、問題を解決するための考えられる解決策を案内するのに役立ちます。 CORSエラー React および Spring Boot アプリケーションで。
指示 | 使用例 |
---|---|
@WebMvcConfigurer | CORS、インターセプター、フォーマッタなどの Web 設定を構成するために使用される Spring Boot アノテーション。この問題のコンテキストでは、特定のオリジンとメソッドを許可する CORS マッピング ルールを定義するために使用されます。 |
allowedOrigins() | このメソッドは CORS 構成の一部であり、サーバーへのアクセスを許可するオリジンを指定します。この場合、「http://localhost:8081」で実行されているフロントエンドがバックエンドと通信できることが保証されます。 |
withCredentials() | クロスオリジンリクエストに Cookie や HTTP 認証などの資格情報を含めることを可能にする Axios 構成。これは、ユーザー固有のデータを必要とする安全なリクエストを処理する場合に非常に重要です。 |
MockMvcRequestBuilders.options() | Spring Boot の MockMvc フレームワークのメソッド。HTTP OPTIONS リクエストをシミュレートするために使用されます。これは通常、CORS でプリフライト リクエストを処理するために使用され、実際のリクエストが送信される前にサーバーのアクセス許可をチェックします。 |
HttpHeaders.ORIGIN | このヘッダーは、CORS でリクエストの送信元を指定するために使用されます。クロスオリジンのシナリオでは、オリジンが許可されているかどうかを確認するために、これがフロントエンドからサーバーに送信されます。 |
MockMvcResultMatchers.header() | これは、応答内の特定の HTTP ヘッダーを確認するために単体テストで使用される方法です。これにより、プリフライト要求に応じて「Access-Control-Allow-Origin」ヘッダーが正しく返されることが保証されます。 |
Authorization: Bearer | Axios リクエストでは、このヘッダーは認証用のベアラー トークンを渡します。これにより、バックエンドがリクエストを行っているクライアントの ID を確実に検証できるようになります。 |
useEffect() | コンポーネントがレンダリングされた後に実行される React Hook。この場合、バックエンドへの API 呼び出しをトリガーするために使用され、コンポーネントのマウント時にプロジェクト データを取得します。 |
axios.get() | HTTP GET リクエストを行うために Axios によって提供されるメソッド。このシナリオでは、Spring Boot API にリクエストを送信し、プロジェクト データを取得するために使用されます。 |
React および Spring Boot アプリケーションでの CORS エラーの処理
上記で提供されているスクリプトは、次の問題を解決することを目的としています。 CORS エラー React フロントエンドと Spring Boot バックエンドのセットアップで。このエラーは、「http://localhost:8081」でホストされているフロントエンドが、「http://localhost:8080」でホストされている Spring Boot API に対して GET リクエストを実行しようとすると発生します。ブラウザーは厳格なセキュリティ ルールを適用して、不正なクロスオリジン リクエストを防止します。そのため、これらの CORS ポリシーが存在します。の WebMvcコンフィギュラー Spring Boot バックエンド構成のクラスは、特定のオリジンとメソッドを許可する CORS ルールを定義するのに役立ち、最終的に問題を解決します。
バックエンドでは、`CorsConfig.java` ファイルが Spring Boot 構成クラスを定義します。の @ビーン そして @オーバーライド アノテーションは、CORS 構成の挿入とカスタマイズに使用されます。 `addCorsMappings()` メソッドの `allowedOrigins()` 関数は、'http://localhost:8081' からのリクエストを明示的に許可し、ブラウザがこのオリジンを信頼できるソースとして認識することを保証します。 `allowedMethods()` を含めることで、GET、POST、OPTIONS を含むすべての HTTP メソッドが確実に許可されます。通常、ブラウザはプリフライト OPTIONS リクエストを送信して、実際の GET リクエストが許可されているかどうかを確認するため、これは非常に重要です。
フロントエンドでは、React は次を使用してリクエストを処理します。 アクシオス、人気のある HTTP クライアント。 「ProjectPage.tsx」ファイルの「fetchData」関数では、「axios.get()」関数が GET リクエストを Spring Boot バックエンドに送信します。 `withCredentials` オプションが true に設定されているため、Cookie と認証資格情報をリクエストとともに送信できます。さらに、ユーザーのトークンを渡すために Authorization ヘッダーが含まれており、リクエストが適切に認証されることを保証します。これらの構成がないと、ブラウザーはセキュリティ上の理由からリクエストをブロックします。
最後に、単体テスト ファイル「CorsTest.java」は、CORS 構成が期待どおりに動作していることを検証します。このテストは、ブラウザーによって行われる実際のプリフライト リクエストを模倣する、バックエンド API への HTTP OPTIONS リクエストをシミュレートします。テストでは、応答に次のような正しいヘッダーが含まれていることを確認します。 アクセス制御許可オリジン、フロントエンドからのクロスオリジンリクエストが可能になります。 `MockMvcResultMatchers.header()` メソッドは、サーバーがプリフライト要求に正しく応答していることを保証します。単体テストを組み込むことで、開発者は CORS 構成がさまざまな環境で信頼性があり、機能することを確認できます。
React + Spring Boot での CORS エラーを構成の調整で解決する
アプローチ 1: バックエンドで Spring Boot CORS 構成を使用する
// CorsConfig.java
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/")
.allowedOrigins("http://localhost:8081")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowedHeaders("*")
.allowCredentials(true);
}
}
Axios を使用して React で Cookie を適切に CORS 処理する
アプローチ 2: クロスオリジン リクエストに対する React フロントエンド Axios 構成
// ProjectPage.tsx
const ProjectsPage = () => {
const [projectsData, setProjectsData] = useState<ProjectsData[]>([]);
const projectsUrl = 'http://localhost:8080/api/projects/admin/toinspection';
useEffect(() => { fetchData(); }, []);
const fetchData = async () => {
const token = Cookies.get('token');
try {
const response = await axios.get<ProjectsData[]>(projectsUrl, {
headers: { "Content-Type": "application/json", Authorization: `Bearer ${token}` },
withCredentials: true
});
setProjectsData(response.data);
} catch (error) {
console.error("Error fetching projects:", error);
}
};
return (
<div>
<AdminPageTemplate type="projects" children=<AdminModContent data={projectsData} />/>
</div>
);
};
export default ProjectsPage;
Spring Boot での単体テストを使用した CORS ポリシーのテスト
アプローチ 3: CORS ポリシーを検証する単体テストを作成する
// CorsTest.java
@RunWith(SpringRunner.class)
@WebMvcTest
public class CorsTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testCorsHeaders() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.options("/api/projects/admin/toinspection")
.header(HttpHeaders.ORIGIN, "http://localhost:8081")
.header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "GET"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.header().exists("Access-Control-Allow-Origin"))
.andExpect(MockMvcResultMatchers.header().string("Access-Control-Allow-Origin", "http://localhost:8081"));
}
}
セキュリティと API 設計のコンテキストで CORS を探索する
対処するときは CORS (クロスオリジンリソース共有) 最新の Web アプリケーションでは、その背後にあるセキュリティへの影響を理解することが重要です。 CORS は、悪意のある Web サイトがユーザーに代わって不正な API リクエストを行うのを防ぐためのセキュリティ対策としてブラウザによって実装されます。これは、認証トークンやユーザー資格情報などの機密データがフロントエンド サービスとバックエンド サービス間で交換されるシナリオでは特に重要です。 Spring Boot バックエンドで CORS を設定する場合は、信頼できるオリジンのみに保護されたリソースへのアクセスを許可することが重要であり、セキュリティ構成がシステム アーキテクチャの重要な要素になります。
もう 1 つの重要な側面は、実際の GET または POST リクエストの前にブラウザによって作成される自動リクエストであるプリフライト リクエストの処理です。これは、サーバーがクロスオリジン要求を許可し、特定のヘッダーまたはメソッドをサポートしているかどうかをクライアントが確認する必要がある場合に発生します。場合によっては、これらを処理する際の設定ミス プリフライトリクエスト 実際のリクエストが Postman などのツールで正常に動作する場合でも、問題が発生して CORS エラーが発生する可能性があります。 Spring Boot の「CorsRegistry」を適切なヘッダーとメソッドで構成すると、プリフライト リクエストが正しく処理され、フロントエンドとバックエンド間のスムーズな対話が可能になります。
さらに、CORS 処理は静的または画一的なものであってはなりません。マイクロサービスで管理されるような動的環境では、API ごとにセキュリティ要件が異なる場合があります。一部の API では特定のメソッドを公開するだけでよい場合がありますが、他の API ではオリジンに対するより厳密な制御が必要な場合もあります。ここで、各エンドポイントの CORS 構成を微調整することが重要になります。適切な CORS 管理は、不必要なプリフライト リクエストを削減し、スムーズなユーザー インタラクションを保証することにより、API パフォーマンスの最適化にも役立ちます。
React および Spring Boot の CORS に関するよくある質問
- CORS とは何ですか? なぜ CORS が必要なのでしょうか?
- CORS は、クロスオリジン要求を許可またはブロックするためにブラウザーによって強制されるセキュリティ メカニズムです。これは、信頼できるオリジンのみが API にアクセスできるようにするために必要です。
- Spring Boot で CORS を有効にするにはどうすればよいですか?
- Spring Boot では、次の設定を行うことで CORS を有効にできます。 @WebMvcConfigurer インターフェイスを使用し、許可されるオリジン、メソッド、およびヘッダーを指定します。 allowedOrigins そして allowedMethods。
- 私のリクエストは Postman では機能するのに、ブラウザでは失敗するのはなぜですか?
- Postman は CORS などのブラウザーのセキュリティ ポリシーをバイパスしますが、ブラウザーはポリシーを厳密に適用します。サーバーがブラウザに適切な CORS ヘッダーを送信していることを確認してください。
- プリフライトリクエストとは何ですか?
- プリフライトリクエストは自動的に行われます。 OPTIONS 特に非単純な HTTP リクエストの場合、ブラウザによって送信されたリクエストを使用して、実際のリクエストがサーバーによって許可されているかどうかを確認します。
- CORS 設定をテストするにはどうすればよいですか?
- 次を使用して CORS 構成をテストできます。 MockMvcRequestBuilders.options() 単体テストでプリフライト要求をシミュレートし、サーバーの応答を検証します。
React と Spring Boot における CORS についての最終的な考え
解決する CORS エラー React と Spring Boot を使用するアプリケーションでは、ブラウザーによって適用されるセキュリティ ポリシーを明確に理解する必要があります。 Spring Boot バックエンドで許可されたオリジンとメソッドを正しく構成することで、これらの問題のほとんどを防ぐことができます。
さらに、リクエスト内のトークンを安全に処理し、適切なヘッダーが送信されるようにすることで、フロントエンド システムとバックエンド システム間の通信がスムーズになります。このガイドは、開発者が直面する一般的な課題に対処し、安全で機能的なクロスオリジンリクエストを保証するのに役立ちます。
React および Spring Boot の CORS ソリューションのソースとリファレンス
- 詳しい取り扱いについて コルス Spring Boot アプリケーションのエラーについては、Spring の公式ドキュメントで参照できます。 Spring フレームワーク CORS ドキュメント
- Axios を使用して React アプリケーションで CORS を管理する方法を理解するには、このガイドを参照してください。 Axios リクエスト構成
- Baeldung のこの記事では、Spring Boot 環境での CORS の構成に関する洞察を提供します。 Baeldung - Spring Boot CORS ガイド
- Mozilla Developer Network (MDN) では、CORS と Web セキュリティにおける CORS の重要性について包括的に説明しています。 MDN Web ドキュメント - CORS