본문 바로가기
Spring

CORS 와 PreFlight

by shulk 2024. 10. 11.

CORS => Cros Orgin Resource Sharing (교차출저 리소스 공유) 2009년에 Html5 표준으로 채택된 프로토콜이며,

SOP에 의해 제한된 교차 출저 간 리소스 공유를 허용하기 위한 방법.

 

그러기 위해서는 위 사진 예시로 구글서버 cors헤더설정 코드에서 네이버를 추가해줘야한다.
SOP => Same Origin Policy (동일 출저 정책) 현재 출저와 동일한 출저의 리소스만 접근할 수 있도록 하는 정책

동일 출저란 도메인,프로토콜,포트번호 모두 동일해야한다. 이렇게 하나라도 다른경우 동일 출저 정책에 의해

리소스 접근이 제한된다. 

 

* SOP가 없을 경우 가능한 보안 취약점은 무엇일까?

사용자 인증 정보에 해당하는 세션 ID같은 정보들이 쿠키에 포함되어 있을 수 있기 때문에, 이 세션 정보를 탈취하여 해킹 공격(XSS/CSRF등)에 이용 할수 있다. 

그러므로 SOP 정책을 통해 다른 도메인에서 접근하지 못하도록 제한하면 이런 해킹을 어느정도 막을 수 있다

 

* CORS 프로토콜이 동작하는 원리를 설명

서버 코드에서 CORS 관련 헤더 설정할 수 있다. 이렇게 허용할 도메인과 HTTP메서드,헤더 종류등을 설정 한다.

이후 브라우저에서 서버로 리소스를 요청할떄,서버가 설정한 헤더의 정보와 일치하지 않으면 브라우저에서 CORS에러가 발생한다.

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")  // 모든 엔드포인트에 대해 CORS 설정 적용
                .allowedOrigins("https://example.com")  // 허용할 도메인 설정
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")  // 허용할 HTTP 메서드
                .allowedHeaders("*")  // 모든 헤더 허용
                .allowCredentials(true)  // 인증 정보 허용 (쿠키 등)
                .maxAge(3600);  // Preflight 요청 캐싱 시간 설정 (1시간)
    }
}

 

CORS 프로토콜 스펙에서 비교적 보안적으로 민감하지 않다고 판단되는 요청이 있는데 이를 단순 요청이라고 하며,이 요청을 제외한 모든 CORS요청에는 실제 요청을 전송하기전 요청 허가를 위한 preflight 요청이 발생할 수 있다.

 

단순요청 => GET,HEAD,POST중 하나이며, 헤더와 컨텐츠타입이 CORS프로토콜에 지정한 값인 경우가 단순 요청에 해당

 

Preflight 요청 => 보안적으로 민감한 CORS 요청에 대해,요청이 가능한지 먼저 확인하는 과정이다. 

브라우저에서 자동으로 실행되는 요청으로,OPTIONS 메서드를 사용하며 서버에서 설정한 CORS 관련 설정들을 HEADER값으로 확인할 수 있다.

이 과정을 통해 허용되지 않은 요청에 대한 처리 부하를 낮출 수 있다

 

* 모든 CORS 요청마다 Preflight 요청이 일어날까?

보안적으로 민감하지 않은 단순 요청이거나,이전에 응답받은 Preflight 응답이 캐싱되어 있는 경우 Preflight 요청이 일어나지 않는다.

 

Chat GPT의 답변 

'Spring' 카테고리의 다른 글

Spring Security-JWT 사용시  (0) 2024.11.11
@QueryHint 와 @Transaction readOnly 차이 / 비공개  (0) 2024.04.08
Spring_5주차-(2)  (0) 2023.12.04
Spring_5주차-(1)  (0) 2023.11.28
Spring_4주차-(2)  (0) 2023.11.14