본문 바로가기
기타

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

by wadekang 2024. 2. 28.

 

SOP (Same-Origin Policy)

  • SOP는 웹 보안의 기본 개념으로, 웹 브라우저가 스크립트에서 실행되는 동안 다른 출처(origin)의 리소스에 대한 접근을 제한하는 정책
  • 출처는 프로토콜(http, https 등), 호스트(도메인 이름), 포트 번호의 조합으로 정의됨
  • SOP는 웹 사이트에서 사용자의 데이터를 보호하기 위해 중요
  • 크로스 사이트 스크립팅(XSS) 공격과 같은 보안 취약점을 방지하기 위해 설계
  • 예를 들어, 한 웹 사이트가 다른 사이트의 쿠키, 로컬 스토리지 등에 접근하는 것을 제한함

CORS (Cross-Origin Resource Sharing)

  • CORS는 웹 애플리케이션이 다른 출처의 리소스에 접근할 수 있도록 허용하는 메커니즘
  • SOP에 의해 기본적으로 제한된 리소스 공유를 가능하게 하며, 서버가 HTTP 헤더에 정책을 포함시킴으로써 다른 출처의 리소스 요청을 안전하게 승인할 수 있음
  • CORS는 웹의 개방성을 증진시키기 위해 존재. 개발자들이 다양한 출처에서 스타일시트, 이미지, 스크립트, API 등을 자유롭게 사용할 수 있도록 해주며, 동시에 보안을 유지함
  • CORS는 HTTP 헤더에 사용하여 작동. 예를 들어, 'Access-Control-Allow-Origin' 헤더는 특정 출처에서 리소스를 요청할 수 있는 권한을 부여함. 이를 통해 서버는 어떤 출처의 요청을 허용하거나 거부할지 결정

차이점

  • 보안 vs 유연성: SOP는 웹 보안을 강화하기 위한 제약 조건으로 작동하는 반면, CORS는 SOP에 의해 설정된 제한을 완화하여 다양한 출처 간의 자원 공유를 가능하게 하는 설정

 

정책 설정

SOP

  • SOP는 클라이언트 측, 특히 웹 브라우저에서 자동으로 적용되는 보안 정책. 웹 개발자가 명시적으로 설정하거나 조정할 수 있는 것이 아니라, 웹 브라우저가 웹 애플리케이션을 실행할 때 기본적으로 적용하는 보안 정책
  • SOP의 주된 목적은 웹 사용자의 데이터 보호. 다른 출처의 리소스에 접근하는 것을 기본적으로 제한함으로써, 악의적인 웹 사이트에 의해 읽히거나 조작되는 것을 방지
  • 개발자들은 CORS와 같은 메커니즘을 사용하여 SOP의 제약을 안전하게 우회할 수 있음

CORS

  • Access-Control-Allow-Origin: 서버가 자신의 리소스를 어떤 출처에서 접근할 수 있게 할지 지정
  • Access-Control-Allow-Methods: 서버가 허용하는 HTTP 메소드(GET, POST 등)를 지정
  • Access-Control-Allow-Headers: 브라우저가 요청에 포함할 수 있는 헤더를 지정
  • Access-Control-Max-Age: 브라우저가 해당 CORS 정책을 캐시할 시간(초 단위)을 지정
  • Access-Control-Allow-Credentials: 인증 정보(쿠키, SSL 인증서 등)와 함께 요청을 보낼 수 있는지 여부를 지정

 

Preflight

  • CORS 정책의 일환으로 웹 브라우저는 특정 조건을 만족하는 요청을 보내기 전에 "preflight" 요청을 던짐
  • Preflight 요청은 서버에게 실제 요청을 안전하게 처리할 수 있는지 확인하는 데 사용되는 사전 요청
  • Preflight 요청은 'OPTIONS' 메소드를 사용하여 이루어짐

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

  • HTTP 요청 메소드가 단순 메소드 (GET, POST, HEAD)가 아닌 경우: 예를 들어, PUT, DELETE, CONNECT, OPTIONS, TRACE, PATCH 등의 메소드를 사용하는 요청에서 preflight가 필요함
  • 단순하지 않은 헤더를 사용하는 경우: CORS 사양에서는 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 헤더 리스트

 

추가 정리

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

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

Postman에서 API 테스트를 할 때는 CORS 에러가 발생하지 않음

  • Postman은 서버 - 서버로 통신되기 때문에 브라우저 정책인 SOP가 반영되지 않아 CORS 에러가 발생하지 않는 것

CORS 에러가 발생한다면 서버에서 CORS 설정을 하는 것, 혹은 프록시 서버 등을 두어 서버를 통해 요청을 수행하도록 구현해야 함

댓글