CORS error는 왜 발생하는가?
CORS error
는 동일 출처 정책에 의해서 브라우저가 발생시키는 에러이다.그럼 SOP(Same-Origin Policy:동일 출처 정책)이란 무엇인가?
SOP
는 한 Origin(현재 내가 접속해 있는 사이트)에서 로드된 문서나 스크립트가 다른 Origin(다른 사이트)에서 가져온 리소스와 상호 작용하는 것을 제한하는 보안방식이다.같은 출처에서만 리소스를 공유
할 수 있다라는 규칙을 가진 정책이다.이미지 출처: https://evan-moon.github.io/2020/05/21/about-cors/
SOP는 왜 만들어졌을까?
F12
개발자 도구만 켜도 소스코드가 적나라하게 드러나며, 어떤 서버와 어떻게 통신 하는지에 대한 각종 정보들을 무리없이 열람할 수 있다.SOP
정책이 없다면 서로 다른 두 애플리케이션이 마음대로 소통할 수 있는 환경이 된다.default
로 하여 어느정도의 보안적인 이점을 가져갈 수 있다.출처(Origin)란?
SOP
정책에 가로막히지 않는다.이미지 출처: [10분 테코톡] 나붐의 CORS
💡
IE
에서는SOP
기준에 두가지 예외사항이 있다. 하지만 위 브라우저는 거의 사용되지 않는 브라우저이므로 참고만 하자.
높음
단계의 보안 수준을 가지고 있을 경우 두 출처가 다르더라도 SOP에 가로막히지 않는다.IE
에서는 Protocol + Host만 도일하다면 같은 출처로 판단한다.CORS(Cross-Origin Resource Sharing: 교차 출처 리소스 공유란?)
CORS는 어떻게 동작할까?
CORS error
는 브라우저에서 발생시키는 오류이다.CORS error
의 발생과정은 다음과 같다.Origin
이라는 필더를 추가한다.Origin
: 요청을 보낸 출처 (eg. http://naver.com)access-control-allow-origin
이라는 필드를 내려준다.access-control-allow-origin
: 해당 리소스를 접근할 수 있게 허용된 출처 (eg. access-control-allow-origin:*)CORS Error를 해결하는 방법은 뭘까?
access-control-allow-origin
설정해주기 ( 정석)@Configuration
설정 방법@CrossOrigin
설정 방법@Configuration
설정 방법// 전역으로 CORS 설정을 할 수 있는 방법
@Configuration
public class CorsFilter implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry){
registry.addMapping("/api") // 적용할 path 패턴
.allowedOrigins("http://localhost:8081") // 허가할 출처들을 기입
.allowedMethods( // 허가할 Method 기입
HrtpMethod.GET.name,
HttpMethod.POST.name,
HttpMethod.PUT.name,
HttpMethod.DELETE.name
);
}
해당 방식은 모든 도메인이 아닌 특정 도메인에서만 허용할 때 사용하는 방식이다.
CORS 설정을 적용시킬 Class
또는 Method
위에 @CrossOrigin의 어노테이션을 붙이면 된다.
@RestController
@RequiredArgsConstructor
@RequestMapping("/api")
@CrossOrigin(origins = {"http://localhost:8080", "http://localhost:9090"}, allowCredentials = "true")
public class MemberController {
@GetMapping("/hello")
public String Hello() {
return "hello";
}
}
하지만 이 방식은 각각의 Class 혹은 Method마다 선언해줘야 하므로 보통은 1번 방식을 사용한다.
Reference
얄코 - 웹개발 짜증유발자! CORS가 뭔가요?
[10분 테코톡] 나붐의 CORS
https://developer.mozilla.org/ko/docs/Web/Security/Same-origin_policy
https://developer.mozilla.org/ko/docs/Web/HTTP/CORS
https://evan-moon.github.io/2020/05/21/about-cors/#preflight-request
https://velog.io/@beomdrive/CORS-%EA%B7%B8-%EC%86%8D%EC%9C%BC%EB%A1%9C