개발 지식/Web Application
CORS - 다른 출처에서 요청이 왔을 때
윤씅
2024. 8. 10. 15:21
∎ 개요
프로젝트를 하던 중, 프론트와 백엔드를 서로 다른 프레임워크로 구현하였다.
이 두 프레임워크 간의 데이터 통신을 해야하는데 CORS 정책을 지켜줘야 한다고 한다.
이 CORS 정책이 뭔지 알아보자~!
∎ CORS (Cross Origin Resource Sharing)
- 브라우저(클라이언트)에서 설정한다.
- 자신과 origin이 다른 곳으로 요청을 못하게 막는다.
- origin이란, "프로토콜+도메인+포트번호"의 조합으로 각자의 '출처'를 의미한다.
∎ CORS를 하는 이유, 브라우저에서 해야하는 이유
CSRF 같은 해킹을 막을 수 있게 도와주는데, 예를 들어 내 이메일로 온 하나의 url을 나도 모르게 클릭했을 때, 나와 출처가 다른 url로 아무 제지 없이 접속이 된다면 내 정보가 바로 흘러들어갈 수 있다.
1. 단순 요청
- 브라우저가 요청을 보낼 때, 헤더의 Origin에 자신의 출처를 적어 보낸다.
- 서버는 응답 헤더의 Access-Control-Allow-Origin에 자신이 허용할 url들을 담아 보낸다.
- 브라우저 측에서 자신의 origin과 Access-Control-Allow-Origin이 같다면 접속을 허용한다.
- 단순 요청은 프로세스는 단순하지만, 요청의 메소드, 헤더, Content-Type 헤더에 넣을 수 있는 항목들이 까다롭다.
- 이 중 Content-Type 헤더는 text/xml, application/json을 허용하지 않는다. 하지만 대부분의 HTTP API 요청의 content-type은 위와 같으므로 우리는 단순 요청보다 아래에 있는 Preflight 요청을 주로 사용한다.
2. 프리플라이트(preflight) 요청
- 본격적인 요청을 보내기 전에 안전한 요청인지 한번 더 확인하는 절차가 있다.
- 이 요청은 HTTP OPTIONS 메소드로 요청한다.
- 하지만 이 방법은 한번의 요청을 더 하는 것이기 때문에 자원을 더 사용하게 되고, 속도도 느려지는 단점이 있다.
- 이를 해결하기 위하여 한번의 통신이 있었으면 그 정보를 캐시에 저장해두고 유효한 기간 동안에는 다시 예비 요청을 하지 않게 만들 수 있다.
3. 인증정보를 보내는 요청
- '인증 정보'를 담고 요청을 보낼 때는 조금 다른 방법을 사용한다.
- 이 요청에는 'Credentials' 옵션이 추가된다.
- 그리고 응답 헤더는 Origin, Methods, Headers에 * 를 사용해 전체를 허용할 수 없다.
- 그리고 이것도 preflight로 예비 요청을 먼저 해야한다.