SpringSecurity:: Pre-flight요청이란?

suragryen·2024년 5월 9일

Spring Security 강의를 듣던중에 pre-flight 요청에 대해 자세히 설명을 안해줘서 찾아봄

Cors란?

CORS는 Cross-Origin Resource Sharing의 약어로 다른 출처의 자원을 공유하는 것이다.

  • 웹 애플리케이션은 리소스가 자신의 출처(도메인, 프로토콜, 포트)와 다를 때 Cross-Origin HTTP 요청을 실행한다.

Pre-flight란?

이 CORS HTTP(s) 요청에는 두가지 요청 방식이 있다. 조건과 함께 살펴보자.

첫번째, Simple Request(단순 요청)이다.

GET, POST, HEAD 요청이어야 한다.
유저 에이전트가 자동으로 설정한 헤더외에, 수동으로 설정할 수 있는 헤더는 Accept, Accept-Language, Content-Language, Content-Type 뿐이다.
Content-Type 헤더는 application/x-www-form-urlencoded, text/plain, multipart/form-data 이어야 한다.
요청에 사용된 XMLHttpRequestUpload 객체에는 이벤트 리스너가 등록되어 있지 않아야 한다.
요청에 ReadableStream 객체가 사용되지 않아야 한다.

**

두번째, Preflight Request(프리플라이트 요청)이다.**

PUT, DELETE, CONNECT, OPTIONS, TRACE, PATCH 방식을 사용하는 경우
금지된 헤더 이름을 사용하는 경우 - https://fetch.spec.whatwg.org/#forbidden-header-name
요청 페이로드 유형이 text/plain, multipart/form-data 또는 application/x-www-form-urlencoded 이 아닌 경우.
하나 이상의 이벤트 리스너가 XMLHttpRequestUpload에 등록되어있는 경우
따라서 나의 경우에서는 Content-type을 application/json을 썼고, authorization 헤더 즉, 사용자 정의 헤더가 설정되었기 때문에 요청이 preflighted 처리가 된 것이다.

왜 Pre-flight?
"preflighted" request는 위에서 논의한 “simple requests” 와는 달리, 먼저 OPTIONS 메서드를 통해 다른 도메인의 리소스로 HTTP 요청을 보내 실제 요청이 전송하기에 안전한지 확인한다. cross-origin 요청은 유저 데이터에 영향을 줄 수 있기 때문에 이와같이 미리 전송(preflighted)합니다.

출처: https://velog.io/@serajang99/CORS-pre-flight%EC%98%88%EB%B9%84-%EC%9A%94%EC%B2%AD

	http
					.authorizeHttpRequests(
							auth ->
									auth
									//.requestMatchers(HttpMethod.OPTIONS, "/**").permitAll()
									.antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
									//특정한 것들에 대해 인증을 비활성화
									.anyRequest().authenticated()
							)// 모든 HTTP 요청이 인증되어야 한다.
					
  • 만일 OPTOINS요청이 어떤 URL 즉"/**"에 유입되면 permitAll()
  • 모든 사람에게 모든 URL에 대한 OPRIONS요청을 허용
  • Simple Request(GET, POST 등) 이 아닐 경우 사용됌
  • 사용자 정의 헤더를 사용하는 경우 사용될 수 있음
profile
블로그 이사중 ☃︎

0개의 댓글