이제는 보안성 때문에 사용하지 않은 예전 기술이다. 상속 비보안 문제로 인해 JSONP는 CORS
로 대체되고 있다.
JSONP는 클라이언트가 아닌, 각기 다른 도메인에 상주하는 서버로부터 데이터를 요청하기 위해 사용된다.
CORS가 막혔을 때 정당한 REST API req 대신 JSONP를 사용하면 <script>로 감싸서 가져오기 떄문에 동일-출처 정책을 우회하는 데이터의 공유를 가능하게 한다.
이 정책은 페이지의 출처 밖에서 가져온 미디어 DOM 요소나 XHR 데이터를 읽기 위해 자바스크립트를 실행하는 것을 허용하지 않는다.
사이트의 scheme, 포트 번호, 호스트 이름의 집합은 출처로 식별된다.
<script type="application/javascript"
src="http://server.example.com/Users/1234?callback=parseResponse">
</script>
parseResponse({"Name": "Foo", "Id": 1234, "Rank": 7});
웹 브라우저는 이 데이터를 유효한 JavaScript 프로그램으로 받아들여 실행하고, 콜백 함수인 parseResponse가 실행되며 받아온 데이터를 처리할 수 있게 된다.
당연히 그에 따라 해당 callback 함수를 서버에서 지원해줘야한다.
또한 응답 데이터는 Text형 이다.
즉, 정리하면 REST 요청이 아닌 <script> 호출 방식으로 뒤에 callback함수를 붙여서 요청한다.
// 콜백 함수 이름을 생성하는 함수
function generateCallbackName() {
return 'jsonp_callback_' + Math.floor(Math.random() * 100000);
}
// JSONP 요청을 보내고 처리하는 함수
function jsonpRequest(url, callback) {
const callbackName = generateCallbackName();
window[callbackName] = function(data) {
delete window[callbackName]; // 콜백 함수 제거
callback(data);
};
const script = document.createElement('script');
script.src = `${url}&callback=${callbackName}`;
document.body.appendChild(script);
}
// 사용 예시
const url = 'https://example.com/api/data?param=value';
jsonpRequest(url, function(data) {
console.log('Response Data:', data);
// 여기서 data를 원하는 방식으로 처리하면 된다.
});
jsonp()