CORS와 spring boot

Limitiz·2022년 6월 6일

spring security

목록 보기
1/1

📌 개념

1. SOP(Same-origin policy)

  • 같은 Origin에만 요청을 보낼 수 있게 제한하는 보안 정책
  • 다른 origin은 SOP 정책에 걸리기 때문에 ajax 요청을 보낼 수 없음

2. Origin (출처)

URL 구조

출처 : https://evan-moon.github.io/2020/05/21/about-cors/

  • Origin = Protocol + Host + Port번호
  • IE의 경우 Port 번호를 포함하지 않음

http://www.example.com/dir/page.html 에 요청을 보낼 때 예시

https://blog.kakaocdn.net/dn/cORtkg/btqGfMgHpAs/mMSYQuZOG4QlW7KFByTXoK/img.png

3. CORS(Cross-Origin Resource Sharing)

  • 서로 다른 Origin끼리 요청을 주고 받을 수 있게 정해둔 표준
  • 브라우저 구현시 사용되기 때문에 서버간 통신에서는 적용 X

동작과정

  1. 브라우저가 요청헤더에 origin 필드에 출처를 담음
  2. 서버가 응답시 응답헤더의 access-control-allow-origin 에 접근을 허용할 출처 포함
    origin 과 비교

preflight request (예비요청)

Untitled

  • 예비 요청에는 HTTP 메소드 중 OPTIONS 메소드 사용
  • CORS 정책 위반으로 인한 에러는 예비 요청의 성공 여부와 별 상관이 없다

simple request

  • 특정 조건을 만족하는 경우에만 예비 요청을 생략 가능
  1. 요청의 메소드는 GETHEADPOST 만 가능
  2. AcceptAccept-LanguageContent-LanguageContent-TypeDPRDownlinkSave-DataViewport-WidthWidth를 제외한 헤더를 사용 불가
  3. Content-Type는 application/x-www-form-urlencodedmultipart/form-datatext/plain만 허용

Credentialed Request

  • 다른 출처 간 통신에서 좀 더 보안을 강화하고 싶을 때 사용
  • credentials옵션
    • same-origin (기본값) : 같은 출처 간 요청에만 인증 정보 동봉 가능
    • include : 모든 요청에 가능
    • omit : 모든 요청에 불가능

📌 Spring Boot에서 설정

💡 나는 하나의 파일에서 CORS를 관리하고 싶어서 1-2 방법을 사용했다.

1. CorsFilter

@Configuration
public class CorsConfig {

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");

        config.addExposedHeader("Authorization");

        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }
}
//SecurityConfig
private final CorsFilter corsFilter;

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http.httpBasic().addFilter(corsFilter)
    }

2. @CrossOrigin

  • 특정 Controller나 메소드의 URL에만 적용
@RequestMapping("/somePath")
@CrossOrigin(origins = "*", allowedHeaders = "*")
public class SomeController { ... }
@RestController
@RequestMapping("/somePath")
public class SomeController {
    @CrossOrigin(origins="*")
    @RequestMapping(value = "/{something}",method = RequestMethod.DELETE)
    public ResponseEntity<String> delete(@PathVariable Long no) throws Exception{ ... }
}

3. WebMvcConfigurer

@Configuration
public class WebConfig implements WebMvcConfigurer {
		@Override
		public void addCorsMappings(CorsRegistry registry) {
		    registry.addMapping("/**")
		            .allowedOrigins("http://localhost:3000");
								//.allowedMethod("GET", "POST");
		}
}

addMapping : CORS를 적용할 URL 패턴 정의

allowedOrigins : 자원공유를 허락할 Origin 설정

allowedMethod : 허용할 HTTP method 설정

allowedHeaders : 허용할 Header

maxAge : 원하는 시간만큼 pre-flight request caching 가능

defualt 값

  • Allow all origins
  • Allow  GET, HEAD, POST
  • Allow all headers
  • Set max age to 30 minutes

4. Proxy 설정


Reference

CORS는 왜 이렇게 우리를 힘들게 하는걸까?

[Spring Boot] CORS 설정하기

profile
👾인생은 디버깅의 연속👾

1개의 댓글

comment-user-thumbnail
2022년 6월 6일

지영님 노션에 이어 새로운 거 또 접수하러 오셨군여!

답글 달기