์นดํ…Œ๊ณ ๋ฆฌ ๋ณด๊ด€๋ฌผ: Javascript

Javascript

JSONP ๋ž€ ๋ฌด์—‡์ด๋ฉฐ ์™œ ๋งŒ๋“ค์–ด ์กŒ์Šต๋‹ˆ๊นŒ? JSONP์˜ ์ตœ์ƒ์œ„

JSONP๋Š” ์ดํ•ดํ•˜์ง€๋งŒ JSONP๋Š” ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. JSON์— ๋Œ€ํ•œ Wikipedia์˜ ๋ฌธ์„œ ๋Š” JSONP์˜ ์ตœ์ƒ์œ„ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋งํ•ฉ๋‹ˆ๋‹ค :

JSONP ๋˜๋Š” โ€œํŒจ๋”ฉ์ด์žˆ๋Š” JSONโ€์€ JSON ํ™•์žฅ์ด๋ฉฐ ์ ‘๋‘์‚ฌ๊ฐ€ ํ˜ธ์ถœ ์ž์ฒด์˜ ์ž…๋ ฅ ์ธ์ˆ˜๋กœ ์ง€์ •๋ฉ๋‹ˆ๋‹ค.

์‘? ๋ฌด์Šจ ์ „ํ™”? ๊ทธ๊ฑด ๋ง์ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. JSON์€ ๋ฐ์ดํ„ฐ ํ˜•์‹์ž…๋‹ˆ๋‹ค. ์ „ํ™”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๋Š” JSONP์— ๋Œ€ํ•ด ์“ด Remy ๋ผ๋Š” ์‚ฌ๋žŒ์˜ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์ž…๋‹ˆ๋‹ค .

JSONP๋Š” ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉ์ž ์ง€์ • ํ•จ์ˆ˜๋กœ ์‘๋‹ต์„ ์ „๋‹ฌํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ ์‚ฝ์ž…์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์ดํ•ด๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


JSONP ๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์™œ ๋งŒ๋“ค์–ด ์กŒ์Šต๋‹ˆ๊นŒ (์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ ๋˜์—ˆ์Šต๋‹ˆ๊นŒ)? ์™œ ๋‚ด๊ฐ€ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ?


๋ถ€๋ก : Wikipedia ์—์„œ JSONP ์šฉ ์ƒˆ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค . ์ด์ œ jvenema ์˜ ๋‹ต๋ณ€์„ ๊ธฐ๋ฐ˜์œผ๋กœ JSONP์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•˜๊ณ  ์ฒ ์ €ํ•œ ์„ค๋ช…์ด ์žˆ์Šต๋‹ˆ๋‹ค.



๋‹ต๋ณ€

์‹ค์ œ๋กœ ๋„ˆ๋ฌด ๋ณต์žกํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค โ€ฆ

domain example.com์— ์žˆ๊ณ  domain ์— ์š”์ฒญํ•˜๋ ค๊ณ  ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์‹ญ์‹œ์˜ค example.net. ์ด๋ ‡๊ฒŒํ•˜๋ ค๋ฉด, ๋‹น์‹ ์€ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค ํฌ๋กœ์Šค ๋„๋ฉ”์ธ A, ๊ฒฝ๊ณ„ ์—†๋Š” ๋” browserland์˜ ๋Œ€๋ถ€๋ถ„.

์ด ์ œํ•œ์„ ์šฐํšŒํ•˜๋Š” ํ•ญ๋ชฉ์€ <script>ํƒœ๊ทธ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ๋„๋ฉ”์ธ ์ œํ•œ์ด ๋ฌด์‹œ๋˜์ง€๋งŒ, ์ •์ƒ์ ์ธ ์ƒํ™ฉ์—์„œ, ๋‹น์‹ ์ด ์ •๋ง๋กœ ํ•  ์ˆ˜์—†๋Š” ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ์— ์•„๋ฌด๊ฒƒ๋„, ์Šคํฌ๋ฆฝํŠธ๋Š” ํ‰๊ฐ€๋ฉ๋‹ˆ๋‹ค.

๋ฅผ ์ž…๋ ฅํ•˜์‹ญ์‹œ์˜ค JSONP. JSONP๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋ฒ„์— ์š”์ฒญํ•˜๋ฉด ํŽ˜์ด์ง€์— ๋Œ€ํ•ด ์„œ๋ฒ„์— ์•Œ๋ ค์ฃผ๋Š” ํŠน์ˆ˜ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด ์„œ๋ฒ„๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ์ฒ˜๋ฆฌ โ€‹โ€‹ํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ์‘๋‹ต์„ ๋ฉ‹์ง€๊ฒŒ ๋งˆ๋ฌด๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์„œ๋ฒ„ callback๊ฐ€ JSONP ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ˜ธ์ถœ๋˜๋Š” ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์˜ˆ์ƒํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์‹ญ์‹œ์˜ค . ๊ทธ๋Ÿฐ ๋‹ค์Œ ์š”์ฒญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

http://www.example.net/sample.aspx?callback=mycallback

JSONP๊ฐ€ ์—†์œผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋ณธ JavaScript ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

{ foo: 'bar' }

๊ทธ๋Ÿฌ๋‚˜ JSONP๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์„œ๋ฒ„๊ฐ€ โ€œ์ฝœ๋ฐฑโ€๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ˆ˜์‹ ํ•˜๋ฉด ๊ฒฐ๊ณผ๊ฐ€ ์•ฝ๊ฐ„ ๋‹ค๋ฅด๊ฒŒ ๋งˆ๋ฌด๋ฆฌ๋˜์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋ฆฌํ„ด๋ฉ๋‹ˆ๋‹ค.

mycallback({ foo: 'bar' });

๋ณด์‹œ๋‹ค์‹œํ”ผ ์ด์ œ ์ง€์ •ํ•œ ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํŽ˜์ด์ง€์—์„œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜์‹ญ์‹œ์˜ค.

mycallback = function(data){
  alert(data.foo);
};

์ด์ œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€๋กœ๋“œ๋˜๋ฉด ํ‰๊ฐ€๋˜๊ณ  ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. Voila, ๋„๋ฉ”์ธ ๊ฐ„ ์š”์ฒญ!

JSONP์˜ ์ฃผ์š” ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜๋Š” ์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์š”์ฒญ์— ๋Œ€ํ•œ ๋งŽ์€ ์ œ์–ด๊ถŒ์„ ์žƒ๊ฒŒ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ ์ ˆํ•œ ์˜ค๋ฅ˜ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์–ป๋Š” โ€œ์ข‹์€โ€๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ํƒ€์ด๋จธ ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ ๋“ฑ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ฒŒ๋˜๋ฉฐ, ์ด๋Š” ํ•ญ์ƒ ์•ฝ๊ฐ„ ์˜์‹ฌ๋ฉ๋‹ˆ๋‹ค. JSONRequest ์ œ์•ˆ์€ ๋„๋ฉ”์ธ ๊ฐ„ ์Šคํฌ๋ฆฝํŒ…์„ ํ—ˆ์šฉํ•˜๊ณ  ๋ณด์•ˆ์„ ์œ ์ง€ํ•˜๋ฉฐ ์š”์ฒญ์„ ์ ์ ˆํžˆ ์ œ์–ด ํ•  ์ˆ˜์žˆ๋Š” ํ›Œ๋ฅญํ•œ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.

์š”์ฆ˜ (2015) CORS ๋Š” JSONRequest์™€ ๋น„๊ตํ•˜์—ฌ ๊ถŒ์žฅ๋˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. JSONP๋Š” ์—ฌ์ „ํžˆ ์˜ค๋ž˜๋œ ๋ธŒ๋ผ์šฐ์ € ์ง€์›์— ์œ ์šฉํ•˜์ง€๋งŒ CORS๊ฐ€ ๋” ๋‚˜์€ ์„ ํƒ์ด ์•„๋‹Œ ํ•œ ๋ณด์•ˆ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.


๋‹ต๋ณ€

JSONP ๋Š” XMLHttpRequest ์™€ ๋™์ผํ•œ ๋„๋ฉ”์ธ ์ •์ฑ… ์„ ๊ทน๋ณตํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค . (์•Œ๋‹ค์‹œํ”ผ AJAX (XMLHttpRequest) ์š”์ฒญ์„ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์œผ๋กœ ๋ณด๋‚ผ ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค .)

๋”ฐ๋ผ์„œ XMLHttpRequest ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  js๊ฐ€ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ ์˜ค๋ ค๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ js ํŒŒ์ผ์„๋กœ๋“œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ HTML ํƒœ๊ทธ ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์ƒํ•œ๋ฐ?

๊ฒƒ์ž…๋‹ˆ๋‹ค โ€“ ๋ฐํ˜€ ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ์™€ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” XMLHttpRequest๋ฅผ ! ์ด๊ฒƒ ์ข€ ๋ด:

script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'http://www.someWebApiServer.com/some-data';

๋‹น์‹ ์€ ๋๋‚ผ ๊ฒƒ์ด๋‹ค ์Šคํฌ๋ฆฝํŠธ ๊ทธ ํ›„ ๊ฐ™์€ ์™ธ๋ชจ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ๋กœ๋“œํ•˜๋„๋ก ์„ธ๊ทธ๋จผํŠธ :

<script>
{['some string 1', 'some data', 'whatever data']}
</script>

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ ์—์„œ์ด ๋ฐฐ์—ด์„ ๊ฐ€์ ธ์™€์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•ฝ๊ฐ„ ๋ถˆํŽธ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ JSONP ์ œ์ž‘์ž๋Š” ์ด๊ฒƒ์ด ๋” ์ž˜ ์ž‘๋™ํ•œ๋‹ค๊ณ  ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'http://www.someWebApiServer.com/some-data?callback=my_callback';

ํ†ต์ง€ my_callback์˜ ์ €๊ธฐ ๊ธฐ๋Šฅ์„? ๋”ฐ๋ผ์„œ JSONP ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ๋ฐ›๊ณ  ์ฝœ๋ฐฑ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ฐพ์œผ๋ฉด ์ผ๋ฐ˜ js ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋Œ€์‹  ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

my_callback({['some string 1', 'some data', 'whatever data']});

์ด์ต์ด ์–ด๋”” ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ์ด์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ ์˜ค๋ฉด ์ž๋™ ์ฝœ๋ฐฑ (my_callback)์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. JSONP
์— ๋Œ€ํ•ด ์•Œ์•„์•ผ ํ•  ๊ฒƒ์€ ์ฝœ๋ฐฑ ๋ฐ ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ์ž…๋‹ˆ๋‹ค.

์ฐธ๊ณ  : ์ด๋“ค์€ JSONP ์‚ฌ์šฉ๋ฒ•์˜ ๊ฐ„๋‹จํ•œ ์˜ˆ์ด๋ฉฐ ํ”„๋กœ๋•์…˜ ์ค€๋น„ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๊ธฐ๋ณธ JavaScript ์˜ˆ์ œ (JSONP๋ฅผ ์‚ฌ์šฉํ•œ ๊ฐ„๋‹จํ•œ Twitter ํ”ผ๋“œ)

<html>
    <head>
    </head>
    <body>
        <div id = 'twitterFeed'></div>
        <script>
        function myCallback(dataWeGotViaJsonp){
            var text = '';
            var len = dataWeGotViaJsonp.length;
            for(var i=0;i<len;i++){
                twitterEntry = dataWeGotViaJsonp[i];
                text += '<p><img src = "' + twitterEntry.user.profile_image_url_https +'"/>' + twitterEntry['text'] + '</p>'
            }
            document.getElementById('twitterFeed').innerHTML = text;
        }
        </script>
        <script type="text/javascript" src="http://twitter.com/status/user_timeline/padraicb.json?count=10&callback=myCallback"></script>
    </body>
</html>

๊ธฐ๋ณธ jQuery ์˜ˆ (JSONP๋ฅผ ์‚ฌ์šฉํ•œ ๊ฐ„๋‹จํ•œ Twitter ํ”ผ๋“œ)

<html>
    <head>
        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
        <script>
            $(document).ready(function(){
                $.ajax({
                    url: 'http://twitter.com/status/user_timeline/padraicb.json?count=10',
                    dataType: 'jsonp',
                    success: function(dataWeGotViaJsonp){
                        var text = '';
                        var len = dataWeGotViaJsonp.length;
                        for(var i=0;i<len;i++){
                            twitterEntry = dataWeGotViaJsonp[i];
                            text += '<p><img src = "' + twitterEntry.user.profile_image_url_https +'"/>' + twitterEntry['text'] + '</p>'
                        }
                        $('#twitterFeed').html(text);
                    }
                });
            })
        </script>
    </head>
    <body>
        <div id = 'twitterFeed'></div>
    </body>
</html>

JSONP ๋Š” JSON with Padding์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค . (๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์ดโ€œํŒจ๋”ฉโ€์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ๊ณผ๋Š” ์•„๋ฌด ๊ด€๋ จ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฆ„์ด ๋งค์šฐ ๋‚ฎ์€ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.)


๋‹ต๋ณ€

JSONP๋Š” ์›๊ฒฉ ๋ฐ์ดํ„ฐ ์„œ๋น„์Šค ์œ„์น˜์— ์š”์ฒญํ•˜๋Š” โ€œscriptโ€์š”์†Œ (HTML ๋งˆํฌ ์—… ๋˜๋Š” JavaScript๋ฅผ ํ†ตํ•ด DOM์— ์‚ฝ์ž…)๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์‘๋‹ต์€ JSON ๋ฐ์ดํ„ฐ๊ฐ€ ์š”์ฒญ๋˜๋Š” ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ์ „๋‹ฌ๋˜๊ณ  ๋ฏธ๋ฆฌ ์ •์˜ ๋œ ํ•จ์ˆ˜์˜ ์ด๋ฆ„์œผ๋กœ ๋ธŒ๋ผ์šฐ์ €์—๋กœ๋“œ ๋œ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋  ๋•Œ JSON ๋ฐ์ดํ„ฐ์™€ ํ•จ๊ป˜ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์–ด ์š”์ฒญ ํŽ˜์ด์ง€๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์Šต๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์„ ๋ณด๋ ค๋ฉด https://blogs.sap.com/2013/07/15/secret-behind-jsonp/๋ฅผ ๋ฐฉ๋ฌธํ•˜์‹ญ์‹œ์˜ค.

ํด๋ผ์ด์–ธํŠธ ์ธก ์ฝ”๋“œ ์Šค ๋‹ˆํŽซ

    <!DOCTYPE html>
    <html lang="en">
    <head>
     <title>AvLabz - CORS : The Secrets Behind JSONP </title>
     <meta charset="UTF-8" />
    </head>
    <body>
      <input type="text" id="username" placeholder="Enter Your Name"/>
      <button type="submit" onclick="sendRequest()"> Send Request to Server </button>
    <script>
    "use strict";
    //Construct the script tag at Runtime
    function requestServerCall(url) {
      var head = document.head;
      var script = document.createElement("script");

      script.setAttribute("src", url);
      head.appendChild(script);
      head.removeChild(script);
    }

    //Predefined callback function    
    function jsonpCallback(data) {
      alert(data.message); // Response data from the server
    }

    //Reference to the input field
    var username = document.getElementById("username");

    //Send Request to Server
    function sendRequest() {
      // Edit with your Web Service URL
      requestServerCall("http://localhost/PHP_Series/CORS/myService.php?callback=jsonpCallback&message="+username.value+"");
    }    

  </script>
   </body>
   </html>

์„œ๋ฒ„ ์ธก PHP ์ฝ”๋“œ

<?php
    header("Content-Type: application/javascript");
    $callback = $_GET["callback"];
    $message = $_GET["message"]." you got a response from server yipeee!!!";
    $jsonResponse = "{\"message\":\"" . $message . "\"}";
    echo $callback . "(" . $jsonResponse . ")";
?>

๋‹ต๋ณ€

๋ฆฌํ„ด ๋œ JSON ์˜ค๋ธŒ์ ํŠธ ์•ž์— ์ ‘ ๋‘๋ถ€๋ฅผ ์ถ”๊ฐ€ํ•˜๋„๋ก ์„œ๋ฒ„์— ์š”์ฒญํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์˜ˆ :

function_prefix(json_object);

๋ธŒ๋ผ์šฐ์ €๊ฐ€ evalJSON ๋ฌธ์ž์—ด์„ ํ‘œํ˜„์‹์œผ๋กœ โ€œ์ธ๋ผ์ธโ€ ํ•˜๊ธฐ ์œ„ํ•ด . ์ด ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•˜๋ฉด ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง์ ‘ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ โ€œ์ฃผ์ž…โ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ โ€œ๋™์ผํ•œ ์›์ โ€์ œํ•œ์„ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰, ๋„๋ฉ”์ธ ๊ฐ„ ๋ฐ์ดํ„ฐ ๊ตํ™˜์„ ๋‹ฌ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .


์ผ๋ฐ˜์ ์œผ๋กœ XMLHttpRequest๋„๋ฉ”์ธ ๊ฐ„ ๋ฐ์ดํ„ฐ ๊ตํ™˜์„ ์ง์ ‘ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (๋™์ผํ•œ ๋„๋ฉ”์ธ์˜ ์„œ๋ฒ„๋ฅผ ํ†ต๊ณผํ•ด์•ผ ํ•จ).

<script src="some_other_domain/some_data.js&prefix=function_prefix>`์›์ ์ด ์•„๋‹Œ ๋„๋ฉ”์ธ์˜ ๋ฐ์ดํ„ฐ์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. โ€œํŠธ๋ฆญโ€์„ ์‹œ๋„ํ•˜๊ธฐ ์ „์— ์„œ๋ฒ„๋ฅผ โ€œ์‹ ๋ขฐํ•  ์ˆ˜์žˆ๋Š”โ€๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•ด์•ผํ•˜์ง€๋งŒ ๊ฐœ์ฒด ํ˜•์‹ ๋“ฑ์˜ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•œ ๋ถ€์ž‘์šฉ์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฝ์šฐ function_prefix(์ฆ‰, ์ ์ ˆํ•œ ๊ธฐ๋Šฅ JS)๊ฐ€ JSON ๊ฐ์ฒด๋ฅผ ์ˆ˜์‹ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ์ƒ๊ธฐ ๊ธฐ๋Šฅ์€ ์ƒ๊ธฐ ๋ฐ˜ํ™˜ ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌ / ์Šน์ธํ•˜๊ธฐ ์ „์— ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜์žˆ๋‹ค.


๋‹ต๋ณ€

JSONP๋Š” ๋„๋ฉ”์ธ ๊ฐ„ ์Šคํฌ๋ฆฝํŒ… ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜์žˆ๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์ธก์—์„œ AJAX ํ”„๋ก์‹œ๋ฅผ ๊ตฌํ˜„ํ•  ํ•„์š”์—†์ด JS๋งŒ์œผ๋กœ JSONP ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

b1t.co ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘๋™ ๋ฐฉ์‹์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. URL์„ ์ถ•์†Œ ํ•  ์ˆ˜์žˆ๋Š” ๋ฌด๋ฃŒ JSONP ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. ์„œ๋น„์Šค์— ์‚ฌ์šฉํ•  URL์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

http://b1t.co/Site/api/External/MakeUrlWithGet?callback=[resultsCallBack]&url=[escapedUrlToMinify]

์˜ˆ๋ฅผ ๋“ค์–ด http://b1t.co/Site/api/External/MakeUrlWithGet?callback=whateverJavascriptName&url=google.com

๋Œ์•„์˜ฌ ๊ฒƒ์ด๋‹ค

whateverJavascriptName({"success":true,"url":"http://google.com","shortUrl":"http://b1t.co/54"});

๋”ฐ๋ผ์„œ get์ด src๋กœ js์—๋กœ๋“œ๋˜๋ฉด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ ํ•ด์•ผํ•˜๋Š” JavascriptName์„ ์ž๋™์œผ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

function minifyResultsCallBack(data)
{
    document.getElementById("results").innerHTML = JSON.stringify(data);
}

์‹ค์ œ๋กœ JSONP ํ˜ธ์ถœ์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ๋ช‡ ๊ฐ€์ง€ ๋ฐฉ๋ฒ• (jQuery ์‚ฌ์šฉ ํฌํ•จ)์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‹ค์Œ์€ ์ˆœ์ˆ˜ํ•œ JS ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.

function minify(urlToMinify)
{
   url = escape(urlToMinify);
   var s = document.createElement('script');
   s.id = 'dynScript';
   s.type='text/javascript';
   s.src = "http://b1t.co/Site/api/External/MakeUrlWithGet?callback=resultsCallBack&url=" + url;
   document.getElementsByTagName('head')[0].appendChild(s);
}

: ๋‹จ๊ณ„ ์˜ˆ์ œ์™€ ์—ฐ์Šต ํ•  ์ˆ˜์žˆ๋Š” JSONP ์›น ์„œ๋น„์Šค์— ์˜ํ•œ ๋‹จ๊ณ„์—์„œ ํ™•์ธํ•  ์ˆ˜์žˆ๋‹ค ์ด ๊ฒŒ์‹œ๋ฌผ์—


๋‹ต๋ณ€

JSONP ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์˜ˆ์ž…๋‹ˆ๋‹ค.

client.html

    <html>
    <head>
   </head>
     body>


    <input type="button" id="001" onclick=gO("getCompany") value="Company"  />
    <input type="button" id="002" onclick=gO("getPosition") value="Position"/>
    <h3>
    <div id="101">

    </div>
    </h3>

    <script type="text/javascript">

    var elem=document.getElementById("101");

    function gO(callback){

    script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = 'http://localhost/test/server.php?callback='+callback;
    elem.appendChild(script);
    elem.removeChild(script);


    }

    function getCompany(data){

    var message="The company you work for is "+data.company +"<img src='"+data.image+"'/   >";
    elem.innerHTML=message;
}

    function getPosition(data){
    var message="The position you are offered is "+data.position;
    elem.innerHTML=message;
    }
    </script>
    </body>
    </html>

server.php

  <?php

    $callback=$_GET["callback"];
    echo $callback;

    if($callback=='getCompany')
    $response="({\"company\":\"Google\",\"image\":\"xyz.jpg\"})";

    else
    $response="({\"position\":\"Development Intern\"})";
    echo $response;

    ?>    

๋‹ต๋ณ€

JSONP๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์ „์— JSON ํ˜•์‹๊ณผ XML์„ ์•Œ์•„์•ผํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์›น์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ ํ˜•์‹์€ XML์ด์ง€๋งŒ XML์€ ๋งค์šฐ ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์›น ํŽ˜์ด์ง€์— ํฌํ•จ ๋œ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ถˆํŽธํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ํ”„๋กœ๊ทธ๋žจ์ด๋ผ ํ• ์ง€๋ผ๋„ JavaScript๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ๊ตํ™˜ ํ•  ์ˆ˜ ์žˆ๋„๋ก JavaScript ๊ฐ์ฒด์— ๋”ฐ๋ฅธ ํ‘œํ˜„์„ ์‚ฌ์šฉํ•˜๊ณ  ๊ฐ„๋‹จํ•œ ๋ฐ์ดํ„ฐ ๊ตํ™˜ ํ˜•์‹ ์ธ JSON์„ ๊ฐœ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค. JSON์€ ๋ฐ์ดํ„ฐ ๋˜๋Š” JavaScript ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

JSON์€ JavaScript์— ์ง์ ‘ ์ž„๋ฒ ๋“œ ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • JSON ํ”„๋กœ๊ทธ๋žจ์„ ์ง์ ‘ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ณด์•ˆ ์ œํ•œ์œผ๋กœ ์ธํ•ด ๋ธŒ๋ผ์šฐ์ € ์ƒŒ๋“œ ๋ฐ•์Šค ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋„๋ฉ”์ธ ๊ฐ„ JSON ์ฝ”๋“œ ์‹คํ–‰์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

์‹คํ–‰ ํ›„ JSON์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋„๋ก JSONP๋ฅผ ๊ฐœ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค. JSONP๋Š” JavaScript ์ฝœ๋ฐฑ ๊ธฐ๋Šฅ ๋ฐ <script> ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์˜ ๋ณด์•ˆ ์ œํ•œ์„ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.

๊ฐ„๋‹จํžˆ ๋งํ•ด JSONP๊ฐ€ ๋ฌด์—‡์ธ์ง€, ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋Š”์ง€ (์‚ฌ์šฉ ํ•  ๋•Œ) ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.


์ด ๊ธ€์€ Javascript ์นดํ…Œ๊ณ ๋ฆฌ๋กœ ๋ถ„๋ฅ˜๋˜์—ˆ๊ณ  ๋‹˜์— ์˜ํ•ด ์— ์ž‘์„ฑ๋์Šต๋‹ˆ๋‹ค.