CORS(Cross Origin Resource Sharing)는 다른 출처를 가진 곳에 리소스 공유를 할 수 있게 도와주는 정책으로 한 도메인 또는 Origin의 웹 페이지가 다른 도메인을 가진 리소스에 접근할 수 있게 해주는 보안 메커니즘이다.
웹 생태계에는 리소스 요청을 제한하는 것과 관련된 두가지 정책이 존재하는데 위의 CORS와 SOP이다.
CORS가 다른 출처로 자료 요청을 하는 정책이라면 SOP는 말 그대로 같은 출처에서만 자료를 공유할 수 있다는 규칙을 가진다.
SOP에서 예외 조항을 두고 이에 해당하는 경우에만 다른 출처에 요청하는 행위를 허용했는데 그중 하나가 CORS이다.
https://evan-moon.github.io/2020/05/21/about-cors/ 에서 빌려온 사진
url들은 위 사진과 같이 구성되어 있다.
여기서 출처(origin)은 Protocol과 host 그리고 포트 번호까지 모두 합친 것을 의미한다. (포트 번호가 생략되어 있는 것은 HTTP 정의 문서 참고하자면 기본 포트 번호가 함께 정의되어 있다고..)
결론적으로 같은 출처라고 한다면 Protocol, host, port까지 모두 동일해야 같은 출처라고 할 수 있다.
CORS는 서버에 구현된 로직이 아닌 브라우저에 구현된 로직
고로 서버간의 통신에서는 CORS는 적용되지 않는다.
서버쪽에는 로그도 남지 않는다.
클라이언트에서 요청을 보낼때 요청 헤더의 Origin이라는 필드에 요청을 보내는 출처를 함께 담아 보낸다.
서버는 이 요청에 대한 응답을 할 때 응답 헤더의 Access-Control-Allow-Origin이라는 값에 이 자료를 접근하는 것이 허용된 출처를 같이 보내준다.
이후 응답을 받은 브라우저에서 Origin과 Access-Control-Allow-Origin을 비교하여 응답이 유효한지를 판단한다.
@CrossOrigin("http://localhost:8080")
@RestController
public class GreetingController {
@GetMapping("/hello")
public String hello() {
return "안녕하세요?";
}
}
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://localhost:8080");
}
}
module.exports = {
mode: "development",
devServer: {
static : "./dist",
proxy: {
'/todo' : {
target: 'http://localhost:3000',
changeOrigin: true
},
'/list' : {
target: 'http://localhost:3000',
changeOrigin: true
}
}
}
서버 공부하려고 혼자 프론트쪽 만지다가 만난 문제.
서버 문제인줄 알고 공부를 시작하였으나 하다보니 브라우저 문제인걸 깨달았지만 결국 서버에서도 세팅해야하는 값이 존재하니 좋은 공부였다.
알아서 안좋을 것 없는 공부!