허원철의 개발 블로그

Spring Boot - CORS 본문

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는 같이 사용이 가능합니다.


참고

 

- SpringBootCors


'web' 카테고리의 다른 글

Reflow와 Repaint  (394) 2017.11.06
책 '토비의 스프링 3.1' 후기  (405) 2017.09.12
Spring Boot - Async 제대로 사용하기  (407) 2017.05.18
Spring Boot - Excel Upload & Download  (418) 2017.05.05
Spring Boot - Data JPA & ModelMapper  (414) 2017.04.30
Comments