Кодировки и URL

Кодирование и декодирование онлайн: Base64 и Base64URL, разбор URL и query-параметров, JWT, процентная запись. Всё считается в браузере, данные не покидают компьютер.

Зачем нужна категория «Кодировки и URL»

Данные редко передаются в том виде, в котором их удобно читать. Одни системы работают только с латиницей, другие — только с байтами, третьи передают двоичные файлы через текстовый протокол. Кодирование переводит данные в подходящий для передачи вид: буквы — в проценты, файл — в набор латинских символов, строку — в последовательность байтов. Обратно переводят тем же способом, только в другую сторону.

  • Токен из заголовка Authorization пришёл в логах одной длинной строкой из трёх частей — что внутри, по внешнему виду не понять.
  • Ссылка из письма потеряла пробелы и превратилась в %20, %D0%9F и плюсы: глазами такой адрес уже не прочитать.
  • В ответе API вместо картинки, PDF или архива пришла длинная строка из латинских букв — так двоичные данные передают текстом.
  • Русский текст в адресной строке выглядит как %D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82, а в другом окне те же буквы лежат ромбами и знаками вопроса.
  • К ссылке для рассылки нужно добавить utm-метки, чтобы переходы были видны в аналитике, и при этом не сломать уже существующие параметры.
  • Строку с пробелами, кавычками и русскими буквами надо передать в ссылке или в письме так, чтобы её не исказили почтовый клиент и мессенджер.
  • При копировании строки из лога потерялось выравнивание по знакам «=» на конце, и приложение отклоняет данные как некорректные.
  • Данные ходят между сервисами, и один из них отдаёт вместо русских букв ромбы: кодировку между сторонами не согласовали.

Категория собирает инструменты под эту работу: посмотреть, что за строка пришла, перевести её в читаемый вид и обратно, разложить адрес на части, разобрать строку запроса, показать содержимое токена. Внутри категории действует одно правило: инструмент решает одну задачу, а близкие варианты собраны режимами в нём же — направление перевода, алфавит, выравнивание, разбор с повторами. Отдельной страницы для обратной операции нет: кодирование и декодирование — это одна задача.

Считают инструменты в браузере: введённое не отправляется на сервер, не сохраняется и исчезает при обновлении вкладки. И помните, что кодирование — не защита: строка, переведённая в Base64 или в проценты, раскрывается тем же инструментом за секунду. Поэтому секреты, которые нельзя показывать, сюда лучше не вставлять.

Частые вопросы о категории

Чем кодирование отличается от шифрования?

Кодирование меняет форму данных, но не прячет их: чтобы раскодировать строку, нужен только алгоритм, а не ключ, поэтому Base64, процентную запись или UTF-8 снимает любой желающий — в том числе инструментом на этой странице. Шифрование скрывает содержимое: без ключа прочитать данные нельзя, и знание алгоритма само по себе не помогает. Отсюда практическое следствие: кодирование защищает от поломки при передаче — запрещённых символов, пробелов, переводов строк, обрезанных байтов, — но не защищает от чужого взгляда. Пароль, ключ или токен, просто переведённый в Base64, остаётся открытым для всех.

Безопасно ли вставлять сюда токены и пароли? Уходят ли данные на сервер?

На сервер не уходит ничего: инструменты считают результат в браузере на JavaScript, введённое не отправляется по сети, не сохраняется и не логируется. Проверить это можно так: откройте страницу, отключите интернет и продолжите работу — результат считается точно так же. Но безопасность этим не ограничивается: вставленная строка останется в буфере обмена, в истории вкладки и в памяти браузера на вашем компьютере. Поэтому рабочие токены и пароли лучше проверять на тестовых значениях, а секрет, который вы не показали бы коллеге в чате, не стоит нести и в сторонний веб-инструмент.

Что такое Base64URL и почему он отличается от обычного Base64?

Обычный Base64 использует знаки «+» и «/», а на конце добивает строку знаками «=» до кратности четырём. В адресе и в токене эти символы мешают: «+» в строке запроса читается как пробел, «/» разделяет путь, «=» отделяет имя параметра от значения. Base64URL заменяет «+» на «-», «/» на «_» и обычно отбрасывает выравнивание — так строка безопасно живёт внутри ссылки и не требует экранирования. Сами данные при этом не меняются: это те же байты, записанные другими символами. Поэтому одно и то же значение в разных местах выглядит по-разному, и при переносе строки важно, какой из двух алфавитов ждёт получатель.

Что такое UTF-8 и почему русский текст в URL выглядит процентами?

UTF-8 — способ записать любой символ Юникода байтами. В адресе по стандарту допустимы только латинские буквы, цифры и небольшой набор служебных знаков, всё остальное кодируется процентной записью: каждый байт превращается в знак «%» и две шестнадцатеричные цифры. Русская буква занимает в UTF-8 два байта, отсюда «%D0%9F» вместо «П» — на одну букву приходится два таких знака. Пробел в пути кодируется как %20, а в строке запроса иногда заменяется плюсом: плюс означает пробел только там. Поэтому одна и та же строка в разных местах адреса выглядит по-разному.

Можно ли доверять данным из JWT, не проверяя подпись?

Нет. Первые две части токена — это Base64URL от обычного JSON, их читает кто угодно и правит без всякого ключа: подпись при этом останется прежней, а содержимое изменится. Подпись как раз и подтверждает, что токен выдал владелец ключа и что поля не тронули по дороге. Проверка подписи требует ключа или публичного ключа сервиса и выполняется на сервере, а не в браузере. Данные из непроверенного токена годятся только для отладки — посмотреть, что за поля пришли, но не принимать по ним решений о доступе.

Почему одну и ту же строку кодируют по-разному: %D0%9F, \u041F, П?

Потому что способов записать нелатинский символ несколько, и каждый решает свою задачу. Процентная запись (%D0%9F) работает с байтами и нужна там, где допустимы только латинские символы: в адресе, в заголовке HTTP, в имени cookie. Экранирование \u041F — запись кода символа для JavaScript и JSON, где важна длина и однозначность строки. HTML-мнемоника П или « — для HTML, где символ иначе слился бы с разметкой. Все три варианта описывают один и тот же символ разными средствами, и подставлять их друг вместо друга нельзя. Поэтому при переносе строки из одной системы в другую важно, какую именно запись ждёт получатель.