그래서, JSONP 또는 CORS? [닫은]


111

내 WebAPI가 인트라넷 환경 에 배포되었습니다 . 그것은 보안 이 내 관심사가 아니었다는 것을 의미 합니다.

CORS는 클라이언트 에게 훨씬 더 친숙 하고 구현하기 쉬운 것 같습니다 .

내가 놓친 다른 우려 사항이 있습니까?

답변:


144

이것은 매우 광범위한 질문이며 위키 자체를 보증 할 수 있습니다. 두 가지에 관해서도 구글에 꽤 많이 있지만, 몇 가지 핵심 포인트를 칠 수 있다고 생각합니다.

  • 서버에 대한 읽기 전용 ajax 인터페이스가 필요하고 IE <= 9, Opera <12 또는 Firefox <3.5 또는 기타 다양한 이전 또는 모호한 브라우저를 지원해야하는 경우 CORS가 종료되면 JSONP를 사용하십시오. IE8 및 IE9 sorta는 CORS를 지원하지만 문제가 있습니다. 아래 첫 번째 주석의 링크를 참조하십시오.
  • 반면에 웹 API가 읽기 (예 : GET)가 아닌 읽기 / 쓰기 (예 : 전체 REST 또는 POST / GET) 인 경우 JSONP가 종료됩니다. CORS를 사용하십시오. JSONP는 본질적으로 읽기 전용입니다.

이들 중 어느 것도 문제가되지 않는다면, 나는 당신에게 가장 쉽거나 가장 친숙한 것을 가지고 갈 것입니다. 문제가 있다면 CORS를 사용해보십시오. 더 "현대적인"솔루션이고 JSONP는 해킹에 가깝기 때문에 데이터를 스크립트로 변환하여 도메인 간 제한을 우회합니다. 그러나 CORS에는 일반적으로 더 많은 서버 측 구성이 필요합니다.

jQuery를 사용하고 있다면 CORS가 " 클라이언트 에게 훨씬 더 친숙 하고 구현하기 쉽다 "는 아이디어를 어디에서 내놓을 지 잘 모르겠습니다 . https://gist.github.com/3131951을 참조 하십시오 . jQuery는 JsonP의 세부 사항을 추상화하고 CORS는 실제로 사용중인 기술에 따라 서버 측에서 구현하기가 다소 까다로울 수 있습니다.

저는 최근에 jquery 및 backbone.js를 사용하여 웹 앱을 개발했습니다. jquery 및 backbone.js는 우리가 제어하는 ​​다양한 도메인 간 웹 서비스에서 읽은 후 IE7을 지원해야했고 조금 더 간단했기 때문에 CORS 대신 Json-P를 사용하게되었습니다. 서버 측 (DjangoRestFramework를 사용하여 Django 실행), 클라이언트 측의 jquery와 거의 동일합니다.


3
IE8 및 IE9를 지원하는 경우 Content-Type이 "text / plain"으로 강제 적용되기 때문에 CORS를 배제 할 수도 있습니다. blogs.msdn.com/b/ieinternals/archive/2010/05의
jamiebarrow

답변의 요지는 매우 도움이됩니다. 감사합니다!
MVCDS

내가 이해 한 것은 클라이언트 측에서 처리해야하는 JSONP와 서버 측에서 처리해야하는 CORS입니다. 옳은?
딥스

GET을 통해 jsonp도 호출 할 수 있다는 점을 추가하고 싶습니다. 백엔드를 코딩하여 쓰기를 수행 할 수 있습니다. 쿼리 문자열에 매개 변수를 전달할 수 있으므로 GET 및 quesystring 매개 변수를 사용하여 게시, 넣기, 패치를 시뮬레이션 할 수 있습니다. (물론 아닌 이상)
가브리엘 Carignano

45

당신은 꽤 자리 잡고 있습니다. 레거시 브라우저 (6 년 이상 전에 출시 된 브라우저)를 지원할 필요가 없다면 CORS를 사용하겠습니다.

CORS는 구현하기가 더 쉽습니다. API가 아직 JSONP 또는 CORS를 지원하지 않는 경우 응답 본문을 수정하는 것보다 몇 가지 정적 헤더를 추가하는 것이 더 쉽습니다.

또한 CORS를 사용하여 요청을 캐시하는 것이 더 쉽습니다. 각 JSONP 요청은 memcached 콘텐츠에서도 동적이어야합니다.

JSONP는 여전히 스크립트 태그이므로 어떤 수준의 동기 동작이 발생하더라도 상관 없습니다. CORS는 그렇지 않습니다.

JSONP는 GET 만 될 수 있습니다. 그리고 CORS와 마찬가지로 모든 방법을 사용할 수 있습니다.


3
"동기식 동작"정보에 감사했습니다.
Juan Lanus 2013 년

비동기 방식으로 스크립트 다운로드를 할 수 있다고 생각합니다. JQuery는 ajax 요청에이 매개 변수를 제공합니다. jsonp에서 작동하는지 여부는 확실하지 않습니다. api.jquery.com/jquery.ajax
eran otzap

11

마지막으로, jQuery v1.x를 사용하는 경우 일부 일반적인 상황 (예 : 네트워크 오류)에서 JSONP 요청에 대해 errorcomplete(또는 더 나은 failalways) 핸들러가 여전히 호출되지 않는다는 점을 고려하십시오 . 물론 해결 방법 (시간 제한 설정, jQuery-JSONP 플러그인)이 있지만 CORS가 덜 성가신다는 것을 알았습니다. 특히 도메인 간 요청이 모바일 장치 (예 : 하이브리드 앱)에서만오고 있으므로 불운 한 브라우저에 대한 지원이 필요하지 않습니다.


1
콜백에 대한 정보 +1
plainjimbo 2014 년

1

Spring Documentation에 따르면 JSONP는 해킹이며 Cross Origin Resource Sharing의 적절한 솔루션이 아닙니다. 따라서 보안이 중요하지 않은 경우 서버에서 도메인 원본을 확인하고 Access-Control-Allow-Origin Response 헤더를 추가하면됩니다.


-1

웹 API는 Windows 인증을 사용하는 Safari (iOS 9.1)에서 작동하지 않았습니다. Safari + iOS 8.4에서 작동했습니다. JSONP로 변경했을 때 Safari가 다시 작동하기 시작했습니다. 자세한 내용은 이 링크 를 확인 하십시오.


이것도 좋은 기사입니다 -blog.algolia.com/jsonp-still-mandatory
Anoop
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.