반응형
개발꿀팁
Spring Boot에서 CORS 방법
1. CORS(Cross-Origin Resource Sharing)란?
교차 출처 리소스 공유(Cross-Origin Resource Sharing, CORS)는 추가 HTTP 헤더를 사용하여, 한 출처에서 실행 중인 웹 애플리케이션이 다른 출처의 선택한 자원에 접근할 수 있는 권한을 부여하도록 브라우저에 알려주는 체제이다. - MDN
- 여기서 origin(출처) 이란 scheme(protocol), host(domain), port 로 구성된다.
- 예를들어, https://www.google.com/maps 라는 주소가 있다고하면
- protocol은 https://
- Host는 www.google.com
- Port는 :443
2. SOP(Same-Origin Policy, 동일 출처 정책)
- SOP(Same-Origin Policy)이란 같은 출처에서만 리소스를 공유할 수 있다는 규칙
- 동일 출처(Same Origin)란 protocol, host, port 가 모두 같을때를 말한다.
- 브라우저에서 다른 서버에서 요청할 경우에 해당되고, 브라우저를 거치지 않고 서버 간 통신을 할 때는 이 정책이 적용되지 않는다.
2-1. 동일 출처 정책의 필요성
- 만약 다른 출처의 어플리케이션이 서로 통신하는 것에 대해 아무런 제약도 존재하지 않는다면 악의를 가진 사용자가 소스 코드를 보고 CSRF(Cross-Site Request Forgery) 나 XSS(Cross-Site Scripting) 와 같은 방법을 사용하여 정보를 탈취할 수 있다.
- CORS는 다른 출처의 리소스가 필요한 경우, 외부 리소스를 사용하기 위한 SOP의 예외 조항이 CORS이다.
3. CORS동작 방식
CORS의 동작 방식은 Simple Request(단순 요청 방법)과 Preflight request(예비 요청을 먼저 보내는 방법)가 있다.
3-1. Simple Request
- 단순 요청 방법은 서버에게 바로 요청을 보내는 방법이다. 단순요청은 서버에 API를 요청하고, 서버는 Access-Control-Allow-Origin 헤더를 포함한 응답을 브라우저에 보낸다. 브라우저는 Access-Control-Allow-Origin 헤더를 확인해서 CORS 동작을 수행할지 판단한다.
Simple request 조건
- 서버로 전달하는 요청(request)이 아래의 3가지 조건을 만족해야 서버로 전달하는 요청이 단순 요청으로 동작한다.
- 요청 메서드(method)는 GET, HEAD, POST 중 하나여야 한다.
- Accept, Accept-Language, Content-Language, Content-Type, DPR, Downlink, Save-Data, Viewport-Width, Width를 제외한 헤더를 사용하면 안 된다.
- Content-Type 헤더는 application/x-www-form-urlencoded, multipart/form-data, text/plain 중 하나를 사용해야 한다.
- 첫 번째 조건은 어렵지 않은 조건이지만 2번, 3번 조건은 상대적으로 까다로운 조건일 수 있다. 2번 조건은 사용자 인증에 사용되는 Authorization 헤더도 포함되지 않으며, 3번 조건은 많은 REST API들이 Content-Type으로 application/json을 사용하기 때문에 지켜지기 어려울 수 있다.
3-2. Preflight Request
- Preflight 요청은 서버에 예비 요청을 보내서 안전한지 판단한 후 본 요청을 보내는 방법이다.
- Preflight 요청은 실제 리소스를 요청하기 전에 OPTIONS라는 메서드를 통해 실제 요청을 전송할지 판단한다.
- OPTIONS 메서드로 서버에 예비 요청을 먼저 보내고, 서버는 이 예비 요청에 대한 응답으로 Access-Control-Allow-Origin 헤더를 포함한 응답을 브라우저에 보냅니다. 브라우저는 단순 요청과 동일하게 Access-Control-Allow-Origin 헤더를 확인해서 CORS 동작을 수행할지 판단한다.
4. SpringBoot에서 CORS에러 해결
스프링 부트에서 CORS를 해결하는 방법은 4가지 정도가 있다. Filter, CrossOrigin, WebMvcConfigure, Spring Security corsConfigurationSource 설정 방법이 있는데 이중 corsConfigurationSource방식에 대해 정리해 보았다.
WebSecurityConfig.java
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
// 중략
@Override
protected void configure(HttpSecurity http) throws Exception {
// cors설정 추가
http
.cors()
.configurationSource(corsConfigurationSource());
// 중략
}
// 중략
@Bean
public CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration configuration = new CorsConfiguration();
// 허용 출처 설정해주기(front)
configuration.addAllowedOrigin("http://localhost:3000"); // local 테스트 시
// 요청 시 오는 HTTP Method허용(*은 모두 허용)
configuration.addAllowedMethod("*");
// 헤더 허용(*은 모두 허용)
configuration.addAllowedHeader("*");
// 노출시킬 헤더
configuration.addExposedHeader("Authorization");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
}
}
반응형
'개발 하나둘셋 > Java & Spring' 카테고리의 다른 글
웹소켓(WebSocket)으로 채팅기능 구현하기 (0) | 2022.01.03 |
---|---|
OOP의 상속 / Implements와 Extends (0) | 2021.12.17 |
Spring Security (0) | 2021.12.11 |
Spring Boot JWT 기본개념과 특징 (0) | 2021.12.10 |
Spring boot에서 AWS S3 파일 업로드 하기 (0) | 2021.12.08 |