-
📝 CORS
✨ 해당 글은 아래 [10분 테코톡]을 듣고 작성했습니다.✨
📌 SOP란?
🔎 먼저 SOP에 대해 알아보자.
- 다른 리소스를 사용하는 것을 제한하는 보안 방식을 말한다.🔎 O에 해당하는 Origin이 무엇인지 알아보자.
- URL은 다음과 같이 이루어져 있다.
- 이때 URL의 Protocol, Host, Port를 통해 같은 출처인지 확인할 수 있다.
- 브라우저 입장에서 Host 비교시 String으로 비교를 한다. (localhost와 127.0.0.1은 다른 Host로 판단된다.)
🔎 SOP는 언제 사용할까?
- 동일한 출처의 리소스만 허용한다.- A출처에서 온 리소스와 B출처에서 온 리소스를 상호작용 하지 못하도록한다.
- 사용자 모르게 해커가 접근하여 서버로 요청을 보내고, 해당 요청에 대한 응답을 해커의 서버로 보내 정보가 유출될 수 있는 상황을 막을 수 있다.
📌 CORS
🔎 다른 출처의 리소스가 필요하면 어떻게 할 수 있을까?
- Cross-Origin-Resource-Sharing을 사용한다. 다음과 같은 세 가지 접근제어 시나리오를 따른다.- 프리플라이트 요청(Preflight Request)
- 단순 요청(Simple Request)
- 인증 정보 포함 요청(Credentialed Request)
🔎 프리플라이트 요청(Preflight Request)이란 무엇인지 알아보자.
- 본 요청을 보내기 전에 사전에 물어본다.- 클라이언트는 서버에 사전 요청을 보내 확인하고, 서버는 해당 사전 요청에 응답을 한다.
- 서버가 사전 요청을 허용했다면 다시 본 요청을 보낸다.
- 총 2번의 통신을 주고 받는다.
- 프리플라이트 요청 포맷을 알아보자.- Origin: 요청 출처
- Access-Control-Request-Method: 실제 요청 메소드
- Access-Control-Request-Headers: 실제 요청의 추가 헤더
- 프리플라이트 응답 포맷을 알아보자.- Access-Control-Allow-Origin: 서버 측 허가 출처
- Access-Control-Allow-Method: 서버 측 허가 헤드
- Access-Control-Allow-Headers: 서버 측 허가 헤더
- Access-Control-Max-Age: 프리플라이트 응답 캐시 시간
- 프리플라이트 응답 메시지가 가져야할 특징이 있다.- 응답 코드는 200대여야 한다.
- 응답 body는 비어있어야 한다.
🔎 단순 요청(Simple Request)란 무엇인지 알아보자.
- 프리플라이트 없이 바로 요청을 보낸다.- GET, POST, HEAD 메소드만 가능하다.
- application/x-www-..., multipart/form-data, text/plan Content-type만 가능하다.
- Accept, Accept-Language, Content-Language, Content-type 헤더만 가능하다.
🔎 인증 정보 포함 요청(Credential Request)을 알아보자.
- 인증 관련 헤더(쿠키, JWT 등)을 포함할 때 사용하는 요청이다.- 클라이언트 - crudentials : include
- 서버 - Access-Control-Allow-Credential : true (이때는 Access-Control-Allow-Origin에 모든 요청을 허용하면 안된다.)
🔎 프리플라이트는 왜 필요한 걸까?
- CORS 이전에 만들어진 SOP 서버를 보호하기 위함이다.- CORS 이전에는 SOP만 가능했다.
- CORS가 등장했지만 기존의 SOP는 CORS에 대한 보안 방식을 확인할 수 있는 메커니즘이 존재하지 않는다.
- 보안적 문제가 생길 수 있으므로 프리플라이트를 통해 서버가 CORS를 인식하고 처리할 수 있는지 먼저 확인하여 CORS를 하지 못하는 서버를 보호할 수 있다.
📌 CORS를 해결하는 방법!
🔎 프론트 프록시 서버를 설정해 준다.
- 프론트 서버에서 백엔드 서버로 요청을 보낼 때 target의 URL을 변경한다.- CORS는 브라우저에서 발생하므로 프론트 서버와 브라우저는 origin과 target을 동일하게 설정해 주고, 프론와 백엔드 통신에서 URL을 변경해 준다.
🔎 직접 헤더에 설정해 준다.
- 직접 헤더에 설정을 추가해 줄 수 있다.🔎 프레임워크를 사용한다.
- 스프링부트의 경우 WebMvcConfigurer를 implements한 설정 파일을 추가하여 Allow-Origin을 추가해 줄 수 있다.'CS > WEB' 카테고리의 다른 글
[WEB] Restful API (0) 2021.08.09 [WEB]웹 서버 VS WAS (0) 2021.07.19 WEB - AJAX (0) 2021.02.26 WEB - WAS (0) 2021.02.20 WEB - SPA (0) 2021.02.20