НейроАгент

Полное руководство по типам содержимого JSON

Узнайте, какой тип содержимого JSON использовать для ваших приложений. Изучите различия между application/json, text/javascript и другими MIME-типами. Понимайте совместимость с браузерами и соображения безопасности для правильной обработки JSON.

Вопрос

Какой тип содержимого JSON следует использовать?

Существует несколько MIME-типов, связанных с JSON:

  • application/json
  • application/x-javascript
  • application/javascript
  • text/javascript
  • text/x-javascript
  • text/x-json

Какие из этих типов содержимого следует использовать для данных JSON и в каких контекстах? Как соображения безопасности и поддержка браузеров влияют на это решение?

НейроАгент

Правильный тип содержимого JSON для использования — application/json, как определено в RFC 4627 и RFC 7159. Это официально зарегистрированный MIME-тип для данных JSON в IANA и его следует использовать в большинстве контекстов для стандартных ответов JSON. Однако проблемы совместимости с браузерами более старых версий могут потребовать альтернативных подходов в конкретных устаревших средах.

Содержание

Понимание типов содержимого JSON

Типы содержимого JSON — это MIME-типы, которые сообщают браузерам и другим клиентам, как интерпретировать данные JSON. Различные доступные сегодня варианты эволюционировали со временем из-за исторической реализации в браузерах, соображений безопасности и усилий по стандартизации.

Основные MIME-типы, связанные с JSON, включают:

  • application/json - официальный стандарт
  • text/javascript - используется для ответов JSONP
  • text/plain - исторически использовался, но не рекомендуется по соображениям безопасности
  • text/json, text/x-json - устаревшие варианты
  • application/ld+json - для связанных данных JSON-LD
  • */*+json - параметризованные варианты

Каждый из них служит разным целям и имеет конкретные последствия для того, как браузеры будут обрабатывать содержимое.


Официальный стандарт: application/json

application/json — это официально зарегистрированный MIME-тип для данных JSON, как указано в RFC 4627 и обновленный в RFC 7159. Этот стандарт определяет JSON как текстовый формат, который полностью независим от языка программирования, но использует соглашения, знакомые программистам на языках семейства C.

Согласно реестру типов носителей IANA, application/json является правильным и предпочтительным MIME-типом для содержимого JSON. Кодировка по умолчанию для JSON — UTF-8, как указано в этих стандартах.

При использовании application/json вы сигнализируете клиентам, что содержимое представляет собой структурированные данные JSON, которые должны быть разобраны как таковые, а не выполнены как код или отображены как обычный текст. Это важно для правильной обработки веб-браузерами, API и другими потребляющими приложениями.


Поддержка браузерами и совместимость

Хотя application/json является стандартом, поддержка браузерами была исторической проблемой:

Поддержка современных браузеров:

  • Все современные браузеры (Chrome, Firefox, Safari, Edge) полностью поддерживают application/json
  • Ожидается правильный разбор и отображение JSON
  • Политики безопасности правильно рассматривают application/json как данные, а не исполняемый код

Проблемы со старыми браузерами:

  • Internet Explorer 7 и ниже имеют проблемы с application/json
  • Эти старые браузеры могут не распознавать application/json как допустимый MIME-тип JSON
  • Для совместимости со старыми браузерами требуются обходные пути

Альтернативные подходы для поддержки старых версий:

javascript
// Пример проверки совместимости со старыми браузерами
function supportsApplicationJson() {
    // Проверка, правильно ли браузер обрабатывает application/json
    var xhr = new XMLHttpRequest();
    xhr.open('GET', 'data:application/json,",true');
    return xhr.getResponseHeader('Content-Type') !== null;
}

Для приложений, которые должны поддерживать очень старые браузеры, некоторые разработчики исторически использовали:

  • text/plain с правильной обработкой содержимого
  • text/x-json как вариант отката

Однако эти подходы больше не рекомендуются для современной разработки.


Вопросы безопасности

Использование правильного MIME-типа имеет решающее значение по соображениям безопасности:

Почему application/json безопасен:

  • Браузеры рассматривают application/json как данные, а не исполняемый код
  • Ответы JSON подчиняются ограничениям политики одного источника
  • Нет риска выполнения кода при использовании правильного MIME-типа

Риски безопасности неправильных типов:

  • text/plain: Может быть рискованно, если JSON содержит похожий на исполняемый код
  • text/javascript: Может интерпретироваться как исполняемый JavaScript
  • application/javascript: Однозначно рассматривается как исполняемый код

Соображения политики безопасности содержимого (CSP):
При реализации CSP правильный MIME-тип помогает предотвратить:

  • атаки межсайтового скриптинга (XSS)
  • уязвимости внедрения кода
  • неверную интерпретацию данных как исполняемого кода

Как указано в документации Sentry, согласно спецификации JSON RFC-4627, при возврате содержимого JSON следует использовать MIME-тип application/json для обеспечения правильной обработки и безопасности.


Специальные случаи использования

JSONP (JSON с оберткой):
Для ответов JSONP правильным MIME-типом является text/javascript, потому что ответы JSONP обернуты в вызов функции и по сути являются исполняемым кодом JavaScript. Это указано в RFC 4392.

JSON-LD (Связанные данные):
Для JSON-LD (JSON для связанных данных) используйте application/ld+json. Это конкретный MIME-тип для семантических веб-приложений и структурированных связанных данных.

Параметризованные варианты JSON:
Шаблон */*+json позволяет использовать параметризованные типы JSON, такие как:

  • application/vnd.api+json (JSON:API)
  • application/problem+json (RFC 7807)
  • application/sjon+json (формат гипермедиа Siren)

Однако поддержка этих параметризованных типов в браузерах различается, и они могут не распознаваться как JSON всеми браузерами.


Лучшие практики

Для API и веб-сервисов:

  • Всегда используйте application/json для ответов JSON
  • Включите правильную кодировку символов UTF-8
  • Правильно установите заголовок Content-Type в ответах вашего сервера
  • Проверяйте, что клиенты ожидают JSON, прежде чем отправлять его

Для фронтенд-разработки:

  • Используйте application/json во всех AJAX-запросах
  • Обрабатывайте совместимость со старыми браузерами, если поддерживаете старые системы
  • Реализуйте правильную обработку ошибок для несоответствий MIME-типов

Пример конфигурации сервера:

javascript
// Пример для Node.js Express
app.get('/api/data', (req, res) => {
    res.setHeader('Content-Type', 'application/json; charset=utf-8');
    res.json({ message: 'Привет, мир!' });
});

Тестирование и валидация:

  • Тестируйте ваш API с разными клиентами для обеспечения правильной обработки JSON
  • Используйте инструменты вроде Postman или curl для проверки заголовков Content-Type
  • Проверяйте инструменты разработчика браузера на правильное распознавание MIME-типа

Распространенные ошибки, которых следует избегать

Использование устаревших MIME-типов:

  • Избегайте text/json - не стандартизирован и ненадежен
  • Избегайте text/x-json - нестандартный и устаревший
  • Избегайте text/x-javascript - сбивающий с толку и нестандартный

Неправильное использование типа содержимого:

  • Не используйте text/plain для JSON - последствия для безопасности
  • Не используйте application/javascript для данных JSON - риск исполняемого кода
  • Не опускайте заголовок Content-Type полностью

Проблемы совместимости с браузерами:

  • Не предполагайте, что все браузеры правильно обрабатывают application/json
  • Не забывайте тестировать со старыми браузерами, если вы их поддерживаете
  • Не игнорируйте установку Content-Type на стороне сервера

Проблемы безопасности:

  • Не доверяйте заголовкам Content-Type, указанным клиентом
  • Не обслуживайте JSON с MIME-типами, похожими на исполняемый код
  • Не забывайте о соображениях CORS при обслуживании JSON

Заключение

Правильный тип содержимого JSON для использования — application/json, как определено в официальных спецификациях JSON (RFC 4627, RFC 7159) и зарегистрированный в IANA. Этот MIME-тип обеспечивает правильную обработку современными браузерами и API, соблюдая лучшие практики безопасности.

Ключевые рекомендации:

  1. Используйте application/json для всех стандартных данных JSON - это отраслевой стандарт, который работает со всеми современными браузерами и инструментами
  2. Рассмотрите text/javascript только для ответов JSONP - когда вам нужно обернуть JSON в функцию обратного вызова для междоменных запросов
  3. Внимательно обрабатывайте совместимость со старыми браузерами - если поддерживаете очень старые браузеры, реализуйте правильное обнаружение и механизмы отката
  4. Всегда устанавливайте правильные заголовки Content-Type - как на стороне клиента, так и на стороне сервера для обеспечения правильной интерпретации
  5. Следуйте лучшим практикам безопасности - используйте правильный MIME-тип для предотвращения внедрения кода и уязвимостей XSS

В случае сомнений:
Для современной веб-разработки придерживайтесь application/json и убедитесь, что ваш сервер правильно устанавливает этот заголовок Content-Type. Отступайте от этого стандарта только в конкретных, хорошо задокументированных случаях, таких как JSONP или при поддержке устаревших систем, требующих специальной обработки.

Источники

  1. RFC 4627 - The application/json Media Type for JavaScript Object Notation (JSON)
  2. RFC 7159 - The JavaScript Object Notation (JSON) Data Interchange Format
  3. Реестр типов носителей IANA
  4. Which JSON content type do I use? - Stack Overflow
  5. What is the Correct Content-Type for JSON? - FreeCodeCamp
  6. JSON Content Types - Sentry
  7. What Is the Correct Mime-Type for JSON and JSONP? - Designcise
  8. Media Types (MIME types) - MDN Web Docs
  9. What is the correct Content Type for JSON? - ReqBin
  10. RFC 4392 - The text/javascript Media Type