작은 지식주머니
CORS란? 본문
!개인 공부용 입니다. 다소 틀린점 부족한점이 있을 가능성이 농후합니다.
Spring Boot REST환경 구축중 CORS 규정 위반 에러에 걸려 해결법을 찾았지만
CORS에 대한 개념이 별로 없기 떄문에 따로 글을 작성해보았습니다.
CORS란
- 교차 출처 리소스 공유 Cross-Origin-Resource-Share의 약자.
처음 리소스를 제공한 도메인(Origin)이 현재 요청하려는 도메인과 다르더라도 요청을 허락해 주는 웹 보안 방칙.
CORS 체제는 브라우저와 서버 간의 안전한 교차 출처 요청 및 데이터 전송을 지원.
최신 브라우저는 XMLHttpRequest 또는 Fetch 같은 API에서 CORS를 사용하여 교차 출처 HTTP 요청의 위험을 완화.
CORS의 동작 방식
웹은 다른 출처의 리소스를 요청할 떄 HTTP 프로토콜을 사용해서 요청을 하는데 이떄 브라우저는 요청 헤더에
Origin 필드에 요청을 보내는 출처를 담아서 전송.
서버는 요청에 대한 응답을 하는데, 응답 헤더에 Access-Control-Allow-Origin 이라는 값에
'해당 리소스를 접근하는 것이 허용된 출처'를 내려준다.
이후 응답을 받은 브라우저는 자신이 보냈던 요청의 Origin과 서버가 보내준 응답의 Access-Control-Allow-Origin
을 비교, 응답이 유효한지 아닌지 결정.
CORS 동작 시나리오
- Preflight Request
- Preflight 방식은 요청을 한번에 보내지 않고 예비 요청, 본 요청을 나누어 서버에 전송하는것.
본 요청을 보내기 전 미리 예비로 보내는 요청을 Preflight라고 하며 Http 메서드 중 Options를 사용
- Preflight 방식은 요청을 한번에 보내지 않고 예비 요청, 본 요청을 나누어 서버에 전송하는것.
- Simple Request
- 예비 요청을 보내지 않고, 서버에게 바로 본 요청을 전송하는 방법.
이 후 서버가 응답 헤더에 Access-Control-Allow-Origin 과 같은 값을 보내주면 그떄 브라우저
CORS 정책 위반 여부를 검사 - 동작 조건으로 요청의 메서드는 GET, HEAD, POST 중 하나여야 한다.
- Accept, Accept-Language, Content-Language, Content-Type, DPR, Downlink, Save-Data, Viewport-Width, Width 외의 다른 헤더를 사용하면 안된다.
- 만약 Content-Type를 사용하는 경우에는 application/x-www-form-urlencoded, multipart/form-data, text/plain만 허용된다.
- 예비 요청을 보내지 않고, 서버에게 바로 본 요청을 전송하는 방법.
- Credentialed Request
- 인증된 요청을 사용하는 방법.
- 다른 출처 간 통신의 보안을 강화할 떄 사용. 브라우저가 제공하는 비동기 리소스 요청 API
XMLHttpRequest 객체 or fetch API는 별도의 옵션 없이 브라우저의 쿠키 정보나 인증과 관련된 헤더를
함부로 요청에 담지 않는데 이떄 요청에 인증과 관련된 정보를 담을 수 있게 해주는 옵션이
Credentials 옵션 - Credentails의 세가지 옵션
- same-origin: 같은 출처 간 요청에만 인증 정보를 담을 수 있다.
- include: 모든 요청에 인증 정보를 담을 수 있다.
- omit : 모든 요청에 인증 정보를 담지 않는다.
- 동작 조건
- 명시적인 URL을 설정해야 한다. EX) Access-Control-Allow-Origin : https://???.com
- 응답 헤더에는 반드시 Access-Control-Allow-Credentials: true로 설정해야함.
- 인증된 요청을 사용하는 방법.
Reference
https://velog.io/@pilyeooong/CORS%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80
https://evan-moon.github.io/2020/05/21/about-cors/#credentialed-request
'TID (Today I Do)' 카테고리의 다른 글
CRA 없이 직접 React 빌드해보기. (0) | 2023.07.27 |
---|---|
JAVA 기술 면접 대비 (0) | 2022.02.24 |
spring @Transactional (0) | 2022.01.26 |
REST 개념공부 (0) | 2022.01.25 |
Comments