결코 자기와 상관없는 두 도메인간에 데이터를 주고 받지는 못한다.
그러면 시작해 보자.
해결해야할 문제
http://mydomain_2.co.kr/service.php 의 내용은 다음과 같다.
{"name":"silver", "age":"10"}
http://mydomain_1.co.kr/get_data.html 의 내용이 다음과 같다고 하자.
<script type="text/javascript"> $.ajax({ url: "http://mydomain_2.co.kr/service.php" }) .done(function( j ) { alert( j.name ); }); </script>
http://mydomain_1.co.kr/get_data.html은 silver라고 표시하지 못한다.
그 이유는 jQuery가 인터넷의 평화를 위해서 서로 다른 도메인간에는 데이터를 읽어오지 못하도록 차단하기 때문이다.
mydomain_1.co.kr에서 mydomain_2.co.kr의 데이터를 가져오려고 하기때문에 jQuery가 훼방을 놓고있는 것이다.
해결방법
만약에 내가 mydomain_1.co.kr과 mydomain_2.co.kr을 통제할 수 있는 사람이라면, 위의 두 파일을 살짝 고쳐서 http://mydomain_1.co.kr/get_data.html이 silver라고 표시하도록 만들 수 있다.
http://mydomain_1.co.kr/get_data.html 의 내용을 다음과 같이 수정한다.
callback=? 라는 표현은 jQuery가 cross domain 기능을 제공하기위해 사용하는 키워드같은 것이다. 그대로 타이핑해 넣어야 한다.<script type="text/javascript"> $.ajax({ url: "http://mydomain_2.co.kr/service.php?callback=?"
,dataType : "jsonp" }) .done(function( j ) { alert( j.name ); }); </script>
http://mydomain_2.co.kr/service.php 의 내용을 다음과 같이 수정한다.
JSON 데이터를 padding하고있는 이 모습을 가리켜 JSON with padding이라 말하고, JSONP라고 줄여서 말한다.<?php echo $_GET['callback'] . '({"name":"silver", "age":"10"})'; ?>
$_GET['callback']을 출력해보면 길이가 아주 긴 임의의 문자열인 것을 확인할 수 있다. 그 문자열은 jQuery가 즉흥적으로 만들어낸 함수이다. (아마도 json parser 함수일 것이다).
아무튼, 이제 http://mydomain_1.co.kr/get_data.html이 silver라고 표시하게 되었다.
-------------
service.php 파일을 다음과 같이 수정하면 "이것이 JSONP!!" 라고 화면에 출력된다.
<?php echo "alert( '이것이 JSONP!!' )"; ?>
파일을 더 간단하게 만든다면,
alert( '이것이 JSONP!!' )
JSONP가 어떻게 돌아가고 있는지 느낌이 오는가?
callback=? 만 넣어주면 jQuery는 상대방 서버가 보내온 데이터를 단순한 데이터가 아닌 실행해야 할 함수로 취급한다.
jQuery가 지어준 함수의 이름을 그대로 사용하면 json parser가 실행되고, 그 외의 javascript 함수이름을 사용하면 그 함수가 실행된다.