CORS는 교차 도메인 AJAX 요청을 수행하는 안전한 방법입니까?


81

CORS (Cross-Origin Resource Sharing)에 대해 읽은 후 보안을 향상시키는 방법을 이해하지 못합니다. 올바른 ORIGIN 헤더가 전송되면 교차 도메인 AJAX 통신이 허용됩니다. 예를 들어 내가 보내면

원산지 : http://example.com

서버는이 도메인이 화이트리스트에 있는지 확인하고 있다면 헤더 :

Access-Control-Allow-Origin : [여기에 수신 된 URL]

응답과 함께 다시 전송됩니다 (간단한 경우이며 사전 요청도 있지만 질문은 동일합니다).

정말 안전한가요? 누군가 정보를 받고자한다면 ORIGIN 헤더를 위조하는 것은 정말 사소한 작업처럼 보입니다. 또한 표준은 정책이 브라우저에서 시행되어 Access-Control-Allow-Origin이 올바르지 않은 경우 응답을 차단한다고 말합니다. 누구든지 해당 정보를 얻으려고하면 표준 브라우저를 사용하여 차단하지 않을 것입니다.


이 답변을 읽으십시오 누군가 동일 출처 정책과 CORS가 무엇이며 왜 존재하는지 명확하지 않습니다 : stackoverflow.com/a/27294846/3340994
— nishantbhardwaj2002

답변:


52

웹 브라우저에서 JavaScript로 Origin 헤더를 위조 할 수 없습니다. CORS는이를 방지하도록 설계되었습니다.

웹 브라우저 외부에서는 중요하지 않습니다. 사람들이 대중이 사용할 수있는 데이터를 얻지 못하도록 설계되지 않았습니다. 대중이 그것을 얻지 않고는 대중에게 공개 할 수 없습니다.

다음과 같이 설계되었습니다.

  • Ajax를 통해 액세스 할 수 있도록 설계된 API를 제공하는 Alice,
  • 웹 브라우저 사용자 Bob
  • 자체 웹 사이트를 운영하는 제 3 자 Charlie

Bob이 Charlie의 웹 사이트를 방문하면 Charlie는 JS를 Bob의 브라우저로 보낼 수 없으므로 Alice의 웹 사이트에서 데이터를 가져와 Charlie에게 보냅니다.

위의 상황은 Bob이 Alice의 웹 사이트에 댓글 게시, 데이터 삭제 또는 일반 대중이 사용할 수 없는 데이터를 볼 수있는 사용자 계정을 가지고있는 경우 더욱 중요해집니다 . 찰리의 JS는 보호없이 Bob의 브라우저에 알릴 수 있기 때문입니다. Bob의 등 뒤에서이를 수행하고 결과를 Charlie에게 보냅니다.

권한이없는 사람이 데이터를 보지 못하도록하려면 암호, SSL 클라이언트 인증서 또는 기타 신원 기반 인증 / 승인 수단으로 데이터를 보호해야합니다.


1
기본적으로 CORS 또는 Cross-Origin 리소스 공유 및 권한 부여는 두 가지 별개의 것입니다. 두문자어에서 알 수 있듯이 실제로 교차 출처 공유를 허용하는 것입니다. 클라이언트가 실제로이를 수행 할 수 있는지 여부는 권한 부여 논리가 결정하는 것입니다.
— reaper_unique

149

목적은 이것을 방지하는 것입니다.

  • 웹 사이트 X로 이동합니다.
  • 웹 사이트 X의 작성자가 브라우저로 전송되는 악의적 인 스크립트를 작성했습니다.
  • 브라우저에서 실행되는 스크립트는 은행 웹 사이트에 로그인하여 악의적 인 작업 을 수행하며 브라우저에서 실행되는 것처럼 실행되기 때문에 그렇게 할 수 있는 권한이 있습니다.

아이디어는 은행 웹 사이트에서 웹 사이트 X의 스크립트가 은행의 페이지에 액세스 할 수 있도록 신뢰할 수 있는지 여부를 브라우저에 알리는 방법이 필요하다는 것입니다.


9
당신의 대답도 매우 분명했습니다. 감사합니다. 15 개의 평판이 필요하기 때문에 찬성 할 수 없습니다.
— Gibarian2001 2011 년

따라서 CORS는 웹 사이트 X에서 앱의 무결성을 보호하지 않습니다. 웹 X가 BANK에 대한 API 호출을 수행하는 데 신뢰할 수 있다고 말하는 BANK의 무결성을 보호하고 있습니까?
— luigi7up 2014

7
@ luigi7up : 아니요, CORS는 아무것도 보호하지 않습니다. 실제로 SOP에 대한 예외를 정의하여 보안을 "약화"시킵니다. Access-Control-Allow-Origin기원은 (에 지정된 헤더 지정 Origin헤더)는 리소스에 대한 액세스가 허용된다. 일반적으로 출처가 동일한 요청 만 그렇게 할 수 있습니다. 여기서 가장 중요한 부분은 허용 / 거부가 서버가 아닌 브라우저에 의해 시행된다는 것입니다. 이것은 Access-Control-Allow-Origin서버 나 서버 자체의 리소스가 아닌 브라우저를 보호 한다는 것을 의미 합니다.
— 다니엘 F.

웹 사이트 X의 작성자가 프록시로 사용되는 사이트 백엔드를 통해 은행에 로그인하지 못하게하는 이유는 무엇입니까? 이것은 그가 만들어야 할 추가 레이어 일 뿐이지 만 브라우저에서 가질 수있는 CORS 문제를 완전히 피할 수있을 것입니다. 그래서 이것은 브라우저 전용 보호 기능으로 보입니다. 아주 간단한 방법으로 ..
— pootzko

1
@pootzko : 귀하의 시나리오에서 악성 웹 사이트 X에는 은행 웹 사이트에 대한 유효한 세션이 없습니다. 피해자가 자신의 뱅킹 (예 : 다른 탭)에 로그인하더라도 브라우저에서 시행하는 쿠키 정책 때문에 악성 사이트 X는 해당 세션에 액세스 할 수 없습니다. 브라우저는 은행 웹 사이트 X.
— 다니엘 f.

64

@jcoder의 답변에 추가하기 위해 Origin 하기 위해 헤더 서버에서 요청한 리소스를 보호하는 것이 아닙니다. 공격자가 적절한 도구로이 헤더를 스푸핑 할 수 있기 때문에이 작업은 다른 수단을 통해 서버 자체에 달려 있습니다.

포인트 Origin헤더 사용자를 보호하는 것입니다. 시나리오는 다음과 같습니다.

  • 공격자가 악성 웹 사이트를 생성 M

  • 사용자 Alice는 실제로 CORS를 지원하는 서버 B에서 CORS를 통해 일부 작업을 수행하려는 스크립트를 포함하는 M에 연결하도록 속임수를 사용합니다.

  • B는 Access-Control-Allow-Origin헤더에 M이 없을 것입니다. 왜 그렇습니까?

  • 핵심은 M이 Origin헤더 를 스푸핑하거나 덮어 쓸 수단이 없다는 것입니다 . 요청이 Alice의 브라우저에서 시작되기 때문입니다. 따라서 그녀의 브라우저는 B에 Origin없는 M으로 (정확한) 값 을 설정 Access-Control-Allow-Origin하므로 요청이 실패합니다.

앨리스는 Origin헤더를 직접 변경할 수 있지만, 자신이 자신을 해치고 있다는 것을 의미하는 이유는 무엇입니까?

TL; DR : Origin 헤더는 무고한 사용자를 보호합니다. 서버의 리소스를 보호하지 않습니다. 공격자가 자신의 컴퓨터에서 스푸핑 할 수 있지만 자신이 제어하지 않는 컴퓨터에서는 스푸핑 할 수 없습니다.

일치하는 Origin헤더가 승인 된 액세스를 의미하지 않기 때문에 서버는 여전히 리소스를 보호해야 합니다. 그러나 Origin일치하지 않는 헤더는 무단 액세스를 의미합니다.


11
아주 좋은 대답입니다. 전체적으로 가장 좋은 IMHO.
— petersaints jul.

이것이 선택된 답이 아닌 이유는 무엇입니까? 이것은 분명히 최고입니다. 이 답변에서 언급 된 네 번째 요점은 포스터가 실제로 요구하는 것입니다.
— alaboudi

베스트 답변 Daniel. 이것이 CORS의 요점입니다. "중심점은 M이 Origin 헤더를 스푸핑하거나 덮어 쓸 수단이 없다는 것입니다. 요청이 ALICE의 브라우저에 의해 시작되기 때문입니다. 따라서 그녀의 브라우저는 (올바른) Origin을 M으로 설정합니다. B의 Access-Control-Allow-Origin이 아니므로 요청이 실패합니다. "
— Lukas Lukac

14

동일한 출처 정책의 목적은 사람들이 일반적으로 웹 사이트 콘텐츠에 액세스하는 것을 막는 것이 아닙니다. 누군가 그렇게하고 싶다면 브라우저도 필요하지 않습니다. 요점은 필요한 액세스 권한없이 다른 도메인의 콘텐츠에 액세스하는 클라이언트 스크립트 를 중지 하는 것입니다. 동일한 출처 정책에 대한 Wikipedia 항목을 참조하십시오 .


2
"요점은 다른 도메인의 콘텐츠에 액세스하는 클라이언트 스크립트를 중지하는 것입니다."이 문제는 동일한 출처 정책으로 해결되었습니다. 아니? 내 웹 사이트에서 JS를 보내고 브라우저가 다른 도메인에 대한 ajax 호출을 허용하지 않습니다. 그것은 동일한 출처 정책입니다. CORS는 매우 oposit을 수행하고 있습니다-내 ajax가 다른 도메인에 액세스하도록 허용합니다. 나는 여기에 거대한 무언가를 놓치고있다 :)
— luigi7up

@ luigi7up에 : 예, CORS는 반대합니다. 웹 사이트 소유자는 둘 이상의 신뢰할 수있는 도메인에서 자신의 서비스에 대한 액세스 권한을 부여 할 수 있습니다.
— SergeyT

6

CORS에 대해 읽은 후 보안을 향상시키는 방법을 이해하지 못합니다.

CORS는 보안을 향상시키지 않습니다. CORS는 서버가 외부 도메인에서 액세스하는 방법을 브라우저에 알리는 메커니즘을 제공하며 CORS 이전에 존재했던 브라우저 보안 모델 (즉, 동일한 출처 정책) 과 일치하는 방식으로이를 시도합니다. ) .

그러나 동일 출처 정책 및 CORS는 범위가 제한됩니다. 특히 CORS 사양 자체에는 요청을 거부하는 메커니즘이 없습니다. 헤더를 사용하여 외부 도메인의 페이지가 응답을 읽지 못하도록 브라우저에 알릴 수 있습니다. 또한 프리 플라이트 요청의 경우 외부 도메인에서 특정 요청을 보내지 않도록 브라우저에 요청할 수 있습니다. 그러나 CORS는 서버가 실제 요청을 거부 (즉, 실행하지 않음)하는 수단을 지정하지 않습니다.

예를 들어 보겠습니다. 사용자가 사이트에 로그인되어 있습니다.A 쿠키를 통해 . 사용자 M가를 수행하는 양식을 제출하려고하는 악성 사이트를로드 POST합니다 A. 무슨 일이 일어날 것? CORS의 유무 M에 관계없이 , 허용 도메인 유무 에 관계없이 브라우저는 A사용자의 인증 쿠키와 함께 요청을 보내고 서버는 악성 프로그램을 실행합니다.POST 사용자가 시작한 것처럼 을 합니다.

이 공격을 Cross-Site Request Forgery라고합니다. 하며 CORS 자체는이를 완화하기 위해 아무것도하지 않습니다. 그렇기 때문에 사용자를 대신하여 데이터 변경 요청을 허용하는 경우 CSRF 보호가 매우 중요합니다.

이제 Origin헤더 사용은 CSRF 보호의 중요한 부분이 될 수 있습니다. 실제로이를 확인하는 것은 다각적 인 CSRF 방어에 대한 현재 권장 사항의 일부입니다 . 그러나 그 사용Origin 헤더의 CORS 사양을 벗어납니다.

요컨대 CORS는 기존의 동일 출처 정책 보안 모델을 다른 허용 도메인으로 확장하는 데 유용한 사양입니다. 보안을 추가하지 않으며 사이트에는 CORS 이전과 동일한 종류의 방어 메커니즘이 필요합니다.


1

나는 대답하기 늦었지만 여기에 어떤 게시물도 실제로 원하는 대답을 제공한다고 생각하지 않습니다. 가장 중요한 점은 브라우저가 origin헤더 값을 쓰는 에이전트라는 것입니다 . 악의적 인 스크립트는 origin헤더 값을 쓸 수 없습니다 . 서버가 Access-Control-Allow-Origin헤더로 응답 하면 브라우저는이 헤더에origin 이전에 보낸 값 . 그렇지 않은 경우 오류를 트리거하고 값을 요청하는 스크립트로 반환하지 않습니다. 이 질문에 대한 다른 답변은 악의적 인 스크립트에 대한 답변을 거부하고 싶을 때 좋은 시나리오를 제시합니다.

@daniel f는 또한 질문에 대한 좋은 대답을 제공합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.