웹(web)

SOP (Same-Origin Policy), CORS (Cross-Origin Resource Sharing)

바코94 2024. 10. 5. 23:46

SOP (Same-Origin Policy)

  • 웹 보안의 기본 개념으로 브라우저가 스크립트에서 다른 origin의 리소스(쿠키, 로컬 스토리지 등)에 대한 접근을 제한하는 정책. 예를 들어, a 사이트의 스크립트에서 b 사이트의 쿠키에 접근하는 것을 제한함 
  • origin는 프로토콜, 호스트, 포트 세 개가 모두 일치해야 동일한 origin으로 판단
  • 악의적인 스크립트로 다른 사이트의 리소스를 사용하고자 하는 것을 막을 수 있음

CORS (Cross-Origin Resource Sharing)

  • SOP에 의해 제한된 것을 완화하여 다른 origin의 리소스에 접근할 수 있도록 허용하는 프로토콜
  • 서버가 허용할 origin을 비롯한 정책을 설정함으로써 다른 origin의 리소스 요청을 허용할 수 있음.
  • 대표적으로 'Access-Control-Allow-Origin' 헤더는 특정 출처에서 리소스를 요청할 수 있는 권한을 부여할 수 있음.

비교점

  • 보안 vs 유연성: SOP는 보안을 강화하기 위한 제약 조건이고 CORS는 SOP에 의한 제한을 완화함. 

 

정책 설정

SOP

  • 브라우저에서 자동으로 적용됨. 개발자가 임의로 설정할 수 없음.
  • 주된 목적은 악의적인 스크립트에 대한 클라이언트 데이터 보호. 
  • CORS와 같은 프로토콜을 사용하여 SOP의 제한을 완화할 수 있음

CORS

  • Access-Control-Allow-Origin: 허용할 origin을 지정
  • Access-Control-Allow-Methods: 허용하는 HTTP 메소드 지정
  • Access-Control-Allow-Headers: 허용하는 헤더 지정
  • Access-Control-Max-Age: 브라우저가 CORS 정책을 캐시할 시간(초) 지정
  • Access-Control-Allow-Credentials: 인증 정보(쿠키, SSL 인증서 등)와 함께 요청을 보낼 수 있는지 여부를 지정

 

추가 정리

브라우저의 요청을 SOP 정책에 따라 차단하는 주체는 브라우저

  • 서버에 CORS 설정이 되어 있지 않으면 다른 origin에 대한 요청을 SOP에 의해 브라우저가 차단함. 브라우저는 웹 페이지가 다른 출처의 서버에 리소스를 요청할 때 CORS 헤더를 확인하여 서버가 적절한 CORS 헤더를 응답하지 않을 경우 요청을 차단 

브라우저가 아니면 CORS 에러가 발생하지 않음

  • 예를 들어 Postman은 브라우저가 아니기 때문에 CORS 에러가 발생하지 않음

 

[Preflight]

  • CORS 정책의 일환으로 브라우저는 특정 조건에서 본 요청을 보내기 전에 "preflight" 요청
  • 서버에 CORS 정책에 맞는 것인지 미리 확인
  • Preflight 요청은 'OPTIONS' 메소드를 사용하여 이루어짐

Preflight 요청은 다음과 같은 경우에 발생

  • 단순 메소드가 아닌 경우. 단순 메소드: GET, POST, HEAD
  • 단순 헤더가 아닌 경우. 단순 헤더: Accept, Accept-Language, Content-Language, Content-Type(application/x-www-form-urlencoded, multipart/form-data, text/plain을 제외한 값

Preflight 요청은 다음과 같은 정보를 포함함

  • Origin: 요청이 시작된 출처
  • Access-Control-Request-Method: 실체 요청에서 사용할 HTTP 메소드
  • Access-Control-Request-Headers: 실제 요청에서 사용할 HTTP 헤더 리스트