
SOP
(Same-Origin Policy)
동일 출처 정책을 의미
‘같은 출처의 리소스만 공유가 가능하다'라는 정책
URL의 origin: https://www.google.com
프로토콜: https
호스트: www.google.com
포트 (기본값): HTTPS의 경우 443 포트를 사용하며, 이는 일반적으로 생략
출처
💡 예시
https://google.comvshttp://google.com
⇒ 두 URI는 프로토콜이 다르기 때문에 동일 출처가 아닙니다. ( https / http )https://google.comvshttps://store.google.com
⇒ 두 URI는 호스트가 다르기 때문에 동일 출처가 아닙니다. ( google.com / store.google.com )http://google.com:81vshttp://google.com
- http 프로토콜의 기본 포트는 80입니다. 따라서
http://google.com는http://google.com:80과 동일합니다.
⇒ 두 URI는 포트가 다르기 때문에 동일 출처가 아닙니다. ( :81 / :80 )https://google.com:443vshttps://google.com
- https 프로토콜의 기본 포트는 443입니다. 따라서
https://google.com는https://google.com:443과 동일합니다.
⇒ 두 URI는 프로토콜, 호스트, 포트가 모두 같은 동일 출처입니다.
SOP이 생겨난 이유
SOP이 없을 경우
SOP이 있는 경우
CORS
(Cross-Origin Resource Sharing)
CORS의 관점에서 에러를 해석한다면
실제 요청 보내기 전, OPTIONS 메서드로 사전 요청을 보내 해당 출처 리소스에 접근 권한이 있는지부터 확인하는 것

실제 요청 전 > Preflight 요청 전송 > 응답 헤더의 Access-Control-Allow-Origin으로 요청을 보낸 출처가 돌아오면 실제 요청을 보냅니다
접근 권한이 없는 경우
프리플라이트 요청이 필요한 이유
실제 요청 보내기 전 미리 권한을 확인할 수 있기 때문에 실제 요청을 처음부터 보내는 것보다 리소스 측면에서 효율적 (거름망처럼 거른다)
CORS에 대비가 되어있지 않은 서버 보호
CORS 이전에 만들어진 서버들은 SOP 요청만 들어오는 상황을 고려하고 만들어졌습니다
따라서 다른 출처에서 들어오는 요청에 대한 대비가 되어있지 않습니다
이런 서버에 요청을 바로 보내면, 응답 보내기 전 우선 요청을 처리 > 브라우저는 응답 받은 후에야 CORS 권한이 없다는 것을 인지 > 에러 띄웠을 때는 이미 요청이 수행된 상태 > 요청이 DELETE나 PUT처럼 서버 정보를 삭제 / 수정하는 경우라면 ? … 이미 소잃은 상태
이렇듯 CORS에 대비가 되어있지 않은 서버라도 프리플라이트 요청을 먼저 보내면 거기서부터 CORS 에러를 띄웁니다
예시와 같이 실행되어서는 안되는 Cross-Origin 요청이 실행되는 것을 방지할 수 있습니다
이러한 이유로 프리플라이트 요청이 CORS의 기본 사양이 되었습니다
특정 조건이 만족되면, 프리플라이트 요청을 생략하고 요청을 보내는 것
💡 조건
-GET,HEAD,POST요청 중 하나여야 합니다.
- GET: 정보를 가져오는 요청
- HEAD: 정보의 헤더(크기, 유형, 수정 날짜 등)만 가져오는 요청
- POST: 데이터를 서버로 보내는 요청
- 자동으로 설정되는 헤더 외에,Accept,Accept-Language,Content-Language,Content-Type헤더의 값만 수동으로 설정할 수 있습니다.
-Content-Type헤더에는application/x-www-form-urlencoded,multipart/form-data,text/plain값만 허용됩니다.
💡 CORS 설정
- 프론트 측에서는 요청 헤더에
withCredentials : true를 넣어줘야 합니다.- 서버 측에서는 응답 헤더에
Access-Control-Allow-Credentials : true를 넣어줘야 합니다.- 서버 측에서
Access-Control-Allow-Origin을 설정할 때, 모든 출처를 허용한다는 뜻의 와일드카드(*)로 설정하면 에러가 발생합니다. 인증 정보를 다루는 만큼 출처를 정확하게 설정해주어야 합니다.

Referer: A를 포함해서 요청Referer를 사용하면 유입경로 수집 가능
Location 헤더가 있으면, Location 위치로 리다이렉트(자동 이동)Location 값은 요청에 의해 생성된 리소스 URILocation 값은 요청을 자동으로 리디렉션하기 위한 대상 리소스를 가리킴