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 |