TL; DR
JSONP는 다른 서버 (다른 출처 * ) 에서 JSON 데이터를 가져 오는 것을 금지하는 보안 제한을 우회하기 위해 고안된 오래된 기술 입니다.
트릭은 사용하여 작동 <script>
예를 들어 그 장소에서 JSON을 요청 태그 :를 { "user":"Smith" }
하지만, 함수의에 싸여 실제 JSONP ( "패딩와 JSON") :
peopleDataJSONP({"user":"Smith"})
이 형식으로 수신하면 peopleDataJSONP
함수 내에서 데이터를 사용할 수 있습니다. JSONP는 나쁜 습관 이므로 사용하지 마십시오 (아래 읽기)
문제
에 대해 탐색 ourweb.com
중이고에서 JSON 데이터 (또는 원시 데이터)를 가져오고 싶다고 가정 해 보겠습니다 anotherweb.com
. GET 요청 (예 XMLHttpRequest
:, fetch
call $.ajax
등)을 사용하는 경우 브라우저는이 추악한 오류로 허용되지 않는다고 알려줍니다.
원하는 데이터를 얻는 방법? 글쎄, <script>
태그는이 전체 서버 (origin *) 제한을받지 않습니다! 그렇기 때문에 CDN과 같은 서버에서 오류없이 jQuery 또는 Google Maps와 같은 라이브러리를로드 할 수 있습니다.
중요한 점 : 당신이 그것에 대해 생각하면, 그 라이브러리는 실제로 실행 가능한 JS 코드입니다 (보통 모든 논리가있는 거대한 함수). 그러나 원시 데이터? JSON 데이터 는 코드가 아닙니다 . 실행할 것이 없습니다. 단순한 데이터 일뿐입니다.
따라서 소중한 데이터를 처리하거나 조작 할 수있는 방법이 없습니다. 브라우저는 <script>
태그가 가리키는 데이터를 다운로드하고 처리 할 때 올바르게 불만을 표시합니다.
이 {"user":"Smith"}
쓰레기는 우리가 적재 한 것입니까? 코드가 아닙니다. 계산 오류, 구문 오류!
JSONP 해킹
그 데이터를 활용하는 구식 / 해킹 방법? 우리는 서버를 로직으로 보내야하므로로드되면 브라우저의 코드가 해당 데이터를 사용할 수 있습니다. 따라서 외부 서버는 JSON 함수 내부에 JSON 데이터를 보냅니다. 데이터 자체는 해당 기능의 입력으로 설정됩니다. 다음과 같이 보입니다 :
peopleDataJSONP({"user":"Smith"})
브라우저가 불평하지 않고 파싱 할 JS 코드 를 만듭니다 ! 정확히 jQuery 라이브러리와 동일합니다. 이제는 클라이언트가 JSONP 친화적 인 서버에 "요청"하여 보통 다음과 같이합니다.
<script src="https://anotherweb.com/api/data-from-people.json?myCallback=peopleDataJSONP"></script>
브라우저는 해당 함수 이름으로 JSONP를 수신하므로 다음과 같이 코드에서 동일한 이름의 함수가 필요합니다.
const peopleDataJSONP = function(data){
alert(data.user); // "Smith"
}
또는 이와 같은 결과 :
function peopleDataJSONP(data){
alert(data.user); // "Smith"
}
브라우저는 JSONP를 다운로드하고 실행하여 함수를 호출 합니다. 인수 data
는 JSON입니다. 이제 원하는 데이터를 처리 할 수 있습니다.
JSONP를 사용하지 말고 CORS를 사용하십시오.
JSONP는 몇 가지 단점이있는 사이트 간 해킹입니다.
- GET 요청 만 수행 할 수 있습니다
- 간단한 스크립트 태그로 트리거 된 GET 요청이므로 유용한 오류나 진행 정보를 얻지 못합니다.
- 악의적 인 페이로드로 변경 될 수있는 클라이언트 JS 코드에서 실행하는 것과 같은 일부 보안 문제도 있습니다.
- JSON 데이터의 문제 만 해결하지만 Same-Origin 보안 정책은 다른 데이터 (WebFonts, drawImage ()로 그린 이미지 / 비디오)에 적용됩니다.
- 매우 우아하거나 읽을 수 없습니다.
테이크 아웃은 요즘 그것을 사용할 필요가 없다는 것 입니다.
JSONP는 다른 서버에서 JSON 데이터를 가져 오는 트릭이지만 다른 종류의 사이트 간 내용이 필요한 경우 동일한 보안 원칙 (Same-Origin)을 위반합니다.
당신이해야 여기 CORS에 대해 읽어 하지만, 그것의 요점은 다음과 같습니다
CORS (Cross-Origin Resource Sharing)는 추가 HTTP 헤더를 사용하여 브라우저가 한 출처에서 실행중인 웹 응용 프로그램에 다른 출처에서 선택한 리소스에 액세스하도록 지시하는 메커니즘입니다. 웹 응용 프로그램은 자신과 다른 출처 (도메인, 프로토콜 또는 포트)를 가진 리소스를 요청할 때 원본 간 HTTP 요청을 실행합니다.
* origin은 protocol , port 및 host의 세 가지로 정의됩니다 . 예를 들어, (다른 프로토콜) 및 (다른 포트)와 분명히 https://web.com
다른 출발지입니다 (다른 호스트)http://web.com
https://web.com:8081
https://thatotherweb.net