웹 에서 다른 출처로의 리소스 요청을 제한하는 것과 관련된 두 가지 정책
1. SOP
2. CORS
SOP(Same Origin Policy)
- 다른출처의 리소스를 사용하는 것에 제한하는 보안방식
- 출처(origin)란 : url의 프로토콜, 호스트, 포트 출처라고하며 하나라도 다르면 다른 출처라고 판단.
익스플로러는 포트가 출처를 판단하지않아 포트가 달라도 가능
SOP를 사용하는 이유
- 중간에 특정한 이유로(특정링크클릭 등)으로 다른 출처로 바꿔치기하여 제3자가 접속하는것을 막기위해 사용
CORS(Cross-Origin Resource Sharing) : 교차출처리소스공유
- SOP의 경우 다른 출처의 리소스를 사용하기 힘들기때문에 몇가지 예외조항을 두고 허용하는 방식
- 추가 HTTP헤더를 사용하여 하나의 출처에서 실행중인 웹 애플리케이션이 다른출처로 접근할수 있는 권한을 부여하도록 브라우저에 알려주는 체제
- 나의 web에 다른사람의 API를 사용할때 사용한다.
ex) 내 web page에 naverMapAPI를 사용할때 naverMapAPI를 사용할수 있도록 권하는 줘야하는데, 권한 주는 방법을 CORS라고 한다.
CORS 권한 부여 종류(3종)
사전확인 요청(Preflight Request)
- HTTP메소드중에 OPTIONS 메소드를 이용하여 다른 도메인의 리소스요청이 가능한지 미리 확인하는 방식
- OPTIONS 메소드: 본 요청을 보내기전에 사전에 보내는 메소스
- 인증구조
- Client가 도메인에 리소스요청 전 OPTIONS 메소드로 Preflight Request(사전확인요청) 전달
- Server는 (1)요청에 의해 가능한지여부를 판단 후 Preflight Reponse(사전확인요청응답)를 회신
- Client는 Preflight Reponse를 받고, 리소스요청이 가능하면 Actual Request(본요청) 전달
- Server는 (3)요청에 Actual Reponse에 리소스를 담아 회신한다.
- Preflight Reponse에서 거부 하면 Client는 Actual Request 보내지 않는다.
- Preflight Request(사전확인요청) 내부 구성
- Origin : 요청 출처
- Access-Control-Request-Method : 요청할 메소드(GET,POST 등)
- Access-Control-Request-Headers : 실제 요청시 어떤거를 추가할수 있는지 여부 확인
- Preflight Reponse(사전확인요청 응답) 내부 구성
- Access-Control-Allow-Origin : 서버에서 허가한 출처 내
- Access-Control-Allow-Method : 서버에서 허가한 메소드 내용
- Access-Control-Allow-Header : 버서측에서 허가한 헤더 내용
- Access-Control-Max-Age : 응답한내용을 캐시에 저장후에 보간기간(매번 사전요청/본요청 두개씩 보낼수없음으로 일정시간 응답내용 저장
- Preflight Reponse 특징
- 응답코드: 200번대
- 응답바디는 비어있는것이 좋다.
단순요청(Simple Request)
- Preflight요청없이 바로 요청을 보내는 방식
- 아래 3개지 조건을 모두 만족하는 경우만 가능하다.
- GET, POST, HEAD 메소드중에 하나여야만 가능
- ConTent-Type 중 3개만 가능(Application/x-www-form-urlencoded, multipart/form-data, text/plain)
- 헤더 4개중 하나여아만 가능(Accept, Accept-Language, Content-Language, Content-Type)
- 3가지조건중 1번을 제외하고는 2번,3번은 조건을 맞추기가 힘들어 특별한경우를 제외하고는 잘사용되지않는다.
인증정보 포함 요청(Credentialed Request)
- 인증관련 헤더를 포함할때 사용하는 요청 방식
- 기존방식보다 조금더 보안을 강화할때 사용하는 방식
참고자료 : https://evan-moon.github.io/2020/05/21/about-cors/