Что такое JSONP

Ответ

JSONP (JSON with Padding) — это старый способ обхода ограничений Same-Origin Policy для кросс-доменных запросов. Вместо прямого AJAX-запроса, JSONP использует тег <script>, который не подпадает под эти ограничения.

Сервер возвращает данные, обернутые в функцию обратного вызова (callback), которая уже определена на клиенте. Например:

function handleResponse(data) {
  console.log(data);
}

const script = document.createElement('script');
script.src = 'https://api.example.com/data?callback=handleResponse';
document.body.appendChild(script);

Сервер ответит так:

handleResponse({name: "John", age: 30});

Особенности:

  • Работает только с GET-запросами
  • Менее безопасен, чем CORS (риск XSS)
  • Устарел, рекомендуется использовать CORS
  • Зависит от доверия к серверу

Ответ 18+ 🔞

Да ты послушай, что за дичь придумали, чтобы браузер не орал про «разные домены»! JSONP, ёбта, это ж как костыль на костыле, причём с гвоздём в жопе.

Вот представь: ты не можешь просто так, с другого сайта, данные стянуть — браузер тебе сразу «Не-а, мудак, политика одинарного происхождения!». А народ-то хитрожопый, нашёл лазейку! Тег <script> — его же не ебёт, откуда скрипт грузить. Вот на этом и сыграли.

Суть проста, как три рубля: ты на своей странице объявляешь функцию, допустим, mySuperCallback. Потом динамически вставляешь скрипт, который грузится с чужого сервака, и в URL передаёшь имя этой функции, типа ?callback=mySuperCallback. А сервер, этот хитрый уёбок, вместо чистого JSON'а тебе возвращает вызов этой самой функции, да ещё и с данными внутрь запихнутыми!

function handleResponse(data) {
  console.log(data);
}

const script = document.createElement('script');
script.src = 'https://api.example.com/data?callback=handleResponse';
document.body.appendChild(script);

И в ответ тебе прилетает не {"name":"John"}, а прямо:

handleResponse({name: "John", age: 30});

Твой браузер это выполняет, и твоя функция срабатывает с готовыми данными! Вообще пиздец, какая извращённая логика.

Но, ясное дело, минусов — овердохуища:

  • Только GET-запросы, никаких POST'ов. Хочешь отправить что-то серьёзное? Иди на хуй, извини.
  • Безопасность — ниже плинтуса. Если тот сервер окажется мудаком и в callback'е пришлёт какой-нибудь вредоносный код — всё, твои пользователи в полной жопе, XSS обеспечен.
  • Он просто устарел, как мои надежды на светлое будущее. Сейчас все нормальные люди используют CORS, это встроенный, контролируемый механизм.
  • И да, тут надо слепо доверять удалённой стороне. Доверия, блядь, ноль, а ты вынужден.

В общем, JSONP — это как ехать на работу на старой «Оке»: вроде едет, но стыдно, небезопасно, и все вокруг смотрят как на дауна. Используй CORS и не выёбывайся.