쉽게 말하면, 그냥 다른 주소에서 접근을 허용 할 건지 말건지 결정하는 거다.
브라우저에서는 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 |