Base64url — это вариант кодирования Base64, разработанный специально для использования в URL, именах файлов и других контекстах, где стандартные символы Base64 + и / создают проблемы. Определённый в RFC 4648, раздел 5, Base64url заменяет + на - (дефис) и / на _ (подчёркивание), а также убирает символы набивки = в конце строки. В результате получается строка, которую можно встраивать прямо в параметр запроса URL, имя файла или HTTP-заголовок без дополнительного процентного кодирования.
Стандартный Base64 (RFC 4648, раздел 4) использует 64 символа: A-Z, a-z, 0-9, + и /. Символы + и / зарезервированы в URL: + интерпретируется как пробел в строках запроса (application/x-www-form-urlencoded), а / является разделителем пути. Поэтому использование стандартного Base64 внутри URL требует процентного кодирования этих символов (%2B, %2F), что увеличивает длину строки и затрудняет её чтение. Base64url полностью устраняет эту проблему, используя URL-безопасные символы с самого начала.
Наиболее известное применение Base64url — JSON Web Tokens (JWT). Все три сегмента JWT — заголовок, полезная нагрузка и подпись — кодируются в Base64url. OAuth 2.0 PKCE code verifier, значения challenge в WebAuthn и многие схемы API-токенов также опираются на Base64url. Понимание этого кодирования необходимо любому разработчику, работающему с аутентификацией, авторизацией или криптографическим обменом данными.
Зачем использовать этот инструмент Base64url?
Конвертируйте текст или бинарные данные в Base64url и обратно прямо в браузере. Поддерживается как кодирование, так и декодирование с автоматической обработкой набивки и замены символов. Отлаживаете ли вы JWT-токен, генерируете PKCE code challenge или создаёте URL-безопасные идентификаторы — этот инструмент обрабатывает всё локально в вашем браузере без какой-либо задержки и без обращений к серверу.
⚡
Мгновенное преобразование
Результат обновляется по мере ввода. Кодируйте текст в Base64url или декодируйте Base64url обратно в текст без задержки — без отправки форм и перезагрузки страницы.
🔗
URL-безопасный вывод
Вывод использует только символы, безопасные в URL, именах файлов и HTTP-заголовках: A-Z, a-z, 0-9, дефис и подчёркивание. Процентное кодирование не требуется.
🔒
Обработка с приоритетом конфиденциальности
Всё кодирование и декодирование выполняется локально в браузере. JWT-токены, секреты OAuth и API-ключи, которые вы вставляете сюда, никогда не передаются на какой-либо сервер.
🏛️
Соответствие стандартам
Реализует RFC 4648, раздел 5 в точности: - и _ заменяют + и /, набивка опущена. Совместимо с JWT-библиотеками, OAuth 2.0 PKCE и реализациями WebAuthn.
Сценарии использования Base64url
Анализ JWT-токенов
Декодируйте отдельные сегменты JWT (заголовок, полезную нагрузку), чтобы проверить утверждения, время истечения срока действия и алгоритмы подписи без импорта JWT-библиотеки и верификации подписи.
Поток OAuth 2.0 PKCE
Генерируйте и проверяйте значения PKCE code_verifier и code_challenge. Метод code_challenge_method S256 требует SHA-256 хеша code_verifier, закодированного в Base64url.
Интеграция WebAuthn / FIDO2
Challenge, credential ID и данные аттестации WebAuthn передаются как строки Base64url между браузером и сервером проверяющей стороны. Декодируйте их для отладки процессов регистрации и аутентификации.
Генерация API-токенов
Создавайте URL-безопасные токены из случайных байт для ссылок сброса пароля, подтверждения email и идентификаторов сессий. Base64url генерирует компактные строки, которые работают в URL без экранирования.
DevOps и CI/CD пайплайны
Храните бинарные значения конфигурации (сертификаты, ключи) в виде строк Base64url в переменных окружения или YAML-файлах. В отличие от стандартного Base64, вывод не содержит символов, конфликтующих с раскрытием переменных оболочки или синтаксисом YAML.
Инженерия данных
Кодируйте бинарные идентификаторы, хеши или контрольные суммы в Base64url для использования в именах файлов, ключах баз данных или столбцах CSV, где символы + и / нарушат разбор или потребуют экранирования.
Стандартный Base64 и Base64url: отличия
Base64url отличается от стандартного Base64 ровно тремя аспектами. Алгоритм кодирования идентичен — изменяются только алфавит и поведение набивки:
Характеристика
Стандартный (RFC 4648 §4)
Base64url (RFC 4648 §5)
Index 62
+
-
Index 63
/
_
Padding
= (required)
Omitted
Эти три отличия означают, что преобразование между стандартным Base64 и Base64url тривиально: замените + на -, / на _ и удалите символы = в конце. В обратном направлении замените - на +, _ на / и добавьте набивку, чтобы длина была кратна 4. Большинство языков предоставляют встроенную поддержку Base64url, делая ручное преобразование излишним. Оба преобразования полностью обратимы и не приводят к потере данных — исходная последовательность байт сохраняется в точности. Эта совместимость гарантирована спецификацией RFC 4648.
Таблица сравнения кодирований
В таблице ниже одни и те же входные данные закодированы стандартным Base64 и Base64url. Обратите внимание, что символы набивки (=) убраны, а + и / заменены на - и _ в URL-safe варианте:
Входные данные
Стандартный Base64
Base64url (без набивки)
Hello
SGVsbG8=
SGVsbG8
A
QQ==
QQ
1+1=2
MSsxPTI=
MSsxPTI
subject?ref=1
c3ViamVjdD9yZWY9MQ==
c3ViamVjdD9yZWY9MQ
ð (thumbs up)
8J+RjQ==
8J-RjQ
Примеры кода
Как кодировать и декодировать строки Base64url на популярных языках. Каждый пример создаёт вывод, безопасный для использования в URL, именах файлов и HTTP-заголовках:
package main
import (
"encoding/base64"
"fmt"
)
func main() {
// Encode to Base64url (no padding)
encoded := base64.RawURLEncoding.EncodeToString([]byte("Hello!"))
fmt.Println(encoded) // → "SGVsbG8h"
// Decode from Base64url
decoded, _ := base64.RawURLEncoding.DecodeString("SGVsbG8h")
fmt.Println(string(decoded)) // → "Hello!"
}
Часто задаваемые вопросы
В чём разница между Base64 и Base64url?
Base64url заменяет + на - и / на _ из стандартного алфавита Base64, а также убирает символы набивки = в конце. Это делает вывод безопасным для использования в URL, параметрах запроса, именах файлов и HTTP-заголовках без дополнительного кодирования. Базовый алгоритм (разбиение байт на 6-битные группы с маппингом на ASCII-символы) идентичен. На практике строки Base64url можно вставлять непосредственно в URL и HTTP-заголовки без изменений, тогда как строки стандартного Base64 в этих контекстах требуют процентного кодирования (%2B для + и %2F для /).
Почему JWT-токены используют Base64url, а не стандартный Base64?
JWT часто передаются в параметрах запроса URL и HTTP-заголовках Authorization. Символы + и / стандартного Base64 потребовали бы процентного кодирования в URL, увеличивая длину и нарушая простые сравнения строк. Спецификация JWT (RFC 7519) предписывает Base64url без набивки, чтобы токены были компактными и URL-безопасными по умолчанию.
Как преобразовать стандартный Base64 в Base64url?
Замените каждый + на -, каждый / на _ и удалите все символы = в конце. В JavaScript: base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, ''). В Python: base64.urlsafe_b64encode(data).rstrip(b'='). Большинство современных языков также предоставляют специальную функцию кодирования Base64url. Такое преобразование часто требуется при интеграции устаревших библиотек, выдающих стандартный Base64, с современными системами, ожидающими Base64url, — например, JWT-валидаторами, серверами OAuth 2.0 и проверяющими сторонами WebAuthn.
Является ли кодирование Base64url обратимым?
Да, Base64url полностью обратим. Для декодирования замените - на + и _ на /, добавьте символы набивки = до кратности длины 4, затем декодируйте как стандартный Base64. Декодированный вывод побайтово идентичен исходным входным данным.
Можно ли использовать Base64url для шифрования данных?
Нет. Base64url — это кодирование, а не шифрование. Оно преобразует бинарные данные в текстовый формат без какой-либо секретности — любой может его декодировать. Если нужно защитить данные, сначала зашифруйте их надлежащим алгоритмом (AES, ChaCha20), а затем закодируйте шифротекст в Base64url для передачи.
Почему в Base64url опускается набивка?
Символы набивки (=) не нужны, когда декодировщик может вычислить количество недостающих байт из длины строки: (4 - length % 4) % 4 даёт необходимую набивку. Убирание набивки делает строку короче и избавляет от символов =, которые потребовали бы процентного кодирования в URL. RFC 4648, раздел 5 явно разрешает опускать набивку в Base64url.
Как обрабатывать строки Base64url с набивкой в коде?
Некоторые системы создают строки Base64url с символами набивки =. Большинство декодировщиков обрабатывают это корректно. Если ваш декодировщик этого не делает, удалите символы = перед декодированием. Обратно, если библиотека требует набивку, вычислите и добавьте её: const padded = str + '='.repeat((4 - str.length % 4) % 4). Это работает, поскольку количество символов набивки детерминировано исходя из длины строки.