Какой тип содержимого 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
- Официальный стандарт: application/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
- Для совместимости со старыми браузерами требуются обходные пути
Альтернативные подходы для поддержки старых версий:
// Пример проверки совместимости со старыми браузерами
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-типов
Пример конфигурации сервера:
// Пример для 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, соблюдая лучшие практики безопасности.
Ключевые рекомендации:
- Используйте application/json для всех стандартных данных JSON - это отраслевой стандарт, который работает со всеми современными браузерами и инструментами
- Рассмотрите text/javascript только для ответов JSONP - когда вам нужно обернуть JSON в функцию обратного вызова для междоменных запросов
- Внимательно обрабатывайте совместимость со старыми браузерами - если поддерживаете очень старые браузеры, реализуйте правильное обнаружение и механизмы отката
- Всегда устанавливайте правильные заголовки Content-Type - как на стороне клиента, так и на стороне сервера для обеспечения правильной интерпретации
- Следуйте лучшим практикам безопасности - используйте правильный MIME-тип для предотвращения внедрения кода и уязвимостей XSS
В случае сомнений:
Для современной веб-разработки придерживайтесь application/json и убедитесь, что ваш сервер правильно устанавливает этот заголовок Content-Type. Отступайте от этого стандарта только в конкретных, хорошо задокументированных случаях, таких как JSONP или при поддержке устаревших систем, требующих специальной обработки.
Источники
- RFC 4627 - The application/json Media Type for JavaScript Object Notation (JSON)
- RFC 7159 - The JavaScript Object Notation (JSON) Data Interchange Format
- Реестр типов носителей IANA
- Which JSON content type do I use? - Stack Overflow
- What is the Correct Content-Type for JSON? - FreeCodeCamp
- JSON Content Types - Sentry
- What Is the Correct Mime-Type for JSON and JSONP? - Designcise
- Media Types (MIME types) - MDN Web Docs
- What is the correct Content Type for JSON? - ReqBin
- RFC 4392 - The text/javascript Media Type