web
Spring Boot - CORS
허원철
2017. 6. 25. 18:19
이번 글은 Spring Boot를 이용하여 CORS를 해보는 예제 글 입니다.
보안상의 이유로 브라우저는 스크립트 내에서 시작된 교착 출처 HTTP 요청을 제한하는데, 이를 SOP라 합니다.
※ SOP(Same-Origin Policy) : 동일 출처 정책, 한 출처(origin)에서 로드된 문서나 스크립트가 다른 출처 자원과 상호작용하지 못하도록 하는 제약입니다.
SOP는 두 Origin 간에 프로토콜, 포트, 호스트가 같아야 동일 Origin라고 할 수 있습니다.
예를 들어, http://www.heowc.com 이라는 URL이 있다면
1 2 3 4 | http://www.heowc.com/user [성공] https://www.heowc.com [실패] - 프로토콜 상이 http://www.heowc.com:8080/ [실패] - 포트 상이 http://blog.heowc.com [실패] - 호스트 상이 | cs |
브라우저 스크립트에서는 jsoup라는 것을 사용하거나 서버에서는 CORS를 이용하여 해결 가능합니다.
※ CORS(Cross-Origin Resource Sharing) : 웹 서버 도메인간 액세스 제어 기능을 제공하여 보안 도메인간 데이터 전송을 가능하게 해줍니다.
동작과정
1. pre-flight request : 실제 요청하려는 경로와 같은 URL에 대해 OPTIONS메소드로 요청을 날려보고 요청가능한지 확인
2. 실제 요청
서버에서는 다음과 같은 설정을 추가해줘야 합니다.
1 2 3 4 5 | Access-Control-Allow-Orgin : 요청을 보내는 페이지의 출처 [ *, 도메인 ] Access-Control-Allow-Methods : 요청을 허용하는 메소드. Default : GET, POST, HEAD Access-Control-Max-Age : 클라이언트에서 preflight의 요청 결과를 저장할 시간 지정. 해당 시간 동안은 pre-flight를 다시 요청하지 않는다. Access-Control-Allow-Headers : 요청을 허용하는 헤더 ... | cs |
Spring Boot에서 활용 해보기
Spring에서 기존에는 Filter를 이용하여 CORS를 허용하였으나, Spring 4.2 이후 버전에서는 @CrossOrigin을 이용하여 쉽게 해결할 수 있습니다. @CrossOrigin은 해당 레벨에 HTTP 메소드를 허용하게 해줍니다.
1) @CrossOrigin 설정
1 2 3 4 5 | @CrossOrigin @GetMapping("{value}") public String get(@PathVariable String value) { return value; } | cs |
2) Global CORS 설정
1 2 3 4 5 6 7 8 | @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/message/**") .allowedOrigins("*") .allowedMethods("POST") .allowCredentials(false) .maxAge(3600); } | cs |
※ @CrosOrigin과 Global CORS는 같이 사용이 가능합니다.
참고