frontend 와 backend api 통신에 있어 크로스도메인 이슈가 발생할 수 있습니다.
CORS: Cross Origin Resource Sharing
그러나 이 문제는 몇가지 방법으로 쉽게 해결할 수 있습니다.
- Access-Control-Allow-Origin
- Reverse Proxy
Access-Control-Allow-Origin
응답헤더 Access-Control-Allow-Orign
에 CORS 를 허용해줄 도메인을 지정하여 해결할 수 있습니다.
springboot
@CrossOrigin 어노테이션
controller 또는 method 상단에 @CrossOrigin
어노테이션을 선언하여 처리 합니다.
기본값은 *
로 모든 도메인을 허용합니다.
1 |
|
특정 도메인만을 처리하려 할 경우 아래와 같이 개별 설정이 가능합니다.
1 | "http://domain.com, http://domain.co.kr") (origins = |
Global CORS 설정
URI Path 를 지정하여 처리할 수 있습니다.
1 | package com.todo.api.config; |
nodejs express
1 | npm install cors |
1 | var express = require('express') |
https://expressjs.com/en/resources/middleware/cors.html
Nginx reverse proxy
Reverse proxy 를 활용해 같은 도메인내에서 Frontend 와 API를 분기하여 사용할 수 있습니다.
IP | domain | |
---|---|---|
proxy | 211.10.10.1 | todos.com |
frontend | 211.10.10.2 | |
API | 211.10.10.3 |
nginx conf
1 | http { |
fetch
http://todos.com 에서 API 를 사용할때 아래와 같이 호출할수 있습니다.
1 | fetch('http://todos.com/api/todos') |
CORS 가 발생하는 원인
SOP(Same-origin policy) 위배
https://developer.mozilla.org/ko/docs/Web/Security/Same-origin_policy
HTML 문서에서 일반적으로 외부 도메인의 자원을 호출하는것은 문제되지 않습니다.
하지만, <script></script>
내에서는 보안상의 이슈로 CORS 가 허용되지 않습니다.
오류 예시
Access to fetch at ‘http://localhost:8080/todos' from origin ‘http://localhost:3000' has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource. If an opaque response serves your needs, set the request’s mode to ‘no-cors’ to fetch the resource with CORS disabled.