TIL

CORS란

하얀잔디 2022. 10. 25. 15:44

쉽게 말하면, 그냥 다른 주소에서 접근을 허용 할 건지 말건지 결정하는 거다.

 

브라우저에서는 cross - origin HTTP 요청들을 제한한다.

 

-> 따라서 cross-origin 요청을 하려면 서버의 요청이 필요함.

서버가 동의하면 브라우저에서는 요청을 허락받고 , 아니면 브라우저에서 거절함.

 

-> 이러한 매커니즘을 CORS ( Cross Origin Resource Sharing)

 

Cross Origin 이 뭔데?

 

아래 세 가지 중 한가지라도 다른 경우를 말한다.

 

1. 프로토콜 (ex : http 와 https 는 프로토콜이 다름)

2. 도메인 

3. 포트번호

 

 

CORS는 왜 필요한데?

 

CORS가 없이 모든 곳에서 데이터를 요청할 수 있게 되면, 다른 사이트에서 원래 사이트를 흉내낼 수 있기 때문.

 

예를들어 기존사이트와 동일하게 도작하도록 해 사용자가 로그인을 하도록 만들고,

로그인했던 세션을 탈취해서 악의적으로 정보를 추출하거나 공격할 수 있음.

 

 

 

어떻게 동작하는데?

 

 

Simple Request 인 경우

1. 서버로 요청을 함

2. 서버의 응답이 왔을 때, 브라우저가 요청한 Origin 과 응답한 헤더 (Access-Control-Request-Headers)의 값을 비교해, 유효한 요청이면 리소스를 응답함.

만약 유효하지 않으면 브라우저에서 이를 막음.

 

 

simple request는 그런데 애초에 되기 생각보다 힘든 조건들임.

 

1.HTTP 메소드가 GET/ POST/ HEAD 이면서 (쉬움)

2. 자동으로 설정되는 헤더 제외 하고

  • Accept
  • Accept-Language
  • Content-Language

만 있으면서 ( 사용자 인증에 사용되는 Authorization 헤더 없음) 

3. Content-Type이

  • application/x-www-form-urlencoded
  • multipart/form-data
  • text/plain

여야함 ( 가장 흔한 content Type인 Json 안됨)

 

 

Preflight request 경우

서버에 예비 요청을 보내서 안전한지 판단 후, 본 요청을 보내는 방법.

 

 

Preflight 요청은, 실제 요청을 보내기전에 OPTIONS 라는 메서드를 통해 실제 요청을 전송할지 판단함.

 

브라우저는 위와 동일하게, Access-Control- Allow- Origin 헤더를 확인해서 CORS 동작을 수행할지 판단함.

 

 

CORS 에러가 발생하면?

 

위에 나왔듯이 그냥 서버에서  Access-Control- Allow- Origin를 포함해 브라우저에 응답하면 됩니다.

 

이에 관련된 내용은 다음 사이트를 참고해주세요!!

 

https://beomy.github.io/tech/browser/cors/

 

[Browser] CORS란?

교차 출처 리소스 공유(Cross-Origin Resource Sharing, CORS)에 대해 살펴보도록 하겠습니다.

beomy.github.io

 

추가로 Spring에서 CORS 관련된 코드는 다음 사이트를 참고해주세요!

https://dev-pengun.tistory.com/entry/Spring-Boot-CORS-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0

 

[Spring Boot] CORS 설정하기

CORS란? (Cross-Origin Resource Sharing,CORS) 란 다른 출처의 자원을 공유할 수 있도록 설정하는 권한 체제를 말합니다. 따라서 CORS를 설정해주지 않거나 제대로 설정하지 않은 경우, 원하는대로 리소스를

dev.exd0tpy.xyz

 

'TIL' 카테고리의 다른 글

interceptor vs Filter  (0) 2022.10.27
Spring Security Form 인증 과정  (0) 2022.10.26
WebSocket 이전의 Client와 Server 간의 통신방법  (0) 2022.10.24
parallelStream()  (0) 2022.10.20
LinkedHashMap 이란  (0) 2022.10.20