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, значення викликів WebAuthn і багато схем API-токенів також покладаються на Base64url. Розуміння цього кодування є необхідним для будь-якого розробника, який працює з автентифікацією, авторизацією або криптографічним обміном даними.
Чому варто використовувати цей інструмент Base64url?
Конвертуйте між Base64url і текстом або двійковими даними безпосередньо у браузері. Підтримується як кодування, так і декодування — з автоматичною обробкою заповнення та замінами символів. Незалежно від того, чи налагоджуєте ви JWT-токен, генеруєте код-виклик PKCE або будуєте 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 (заголовок, корисне навантаження) для перевірки claims, термінів дії та алгоритмів підпису без імпорту JWT-бібліотеки чи верифікації підпису.
Потік OAuth 2.0 PKCE
Генеруйте та перевіряйте значення code_verifier і code_challenge для PKCE. Метод code_challenge_method S256 вимагає SHA-256-хешу code_verifier, закодованого у Base64url.
Інтеграція WebAuthn / FIDO2
Виклики WebAuthn, ідентифікатори облікових даних і дані атестації передаються у вигляді рядків Base64url між браузером і сервером довіряючої сторони. Декодуйте їх для налагодження реєстрації та аутентифікаційних потоків.
Генерація API-токенів
Створюйте URL-безпечні токени з випадкових байтів для посилань скидання пароля, підтвердження email та ідентифікаторів сесій. Base64url створює компактні рядки, які працюють у URL без екранування.
Конвеєри DevOps і CI/CD
Зберігайте двійкові значення конфігурації (сертифікати, ключі) у вигляді рядків Base64url у змінних середовища або YAML-файлах. На відміну від стандартного Base64, вивід не містить символів, які конфліктують із розширенням shell або синтаксисом 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-безпечному варіанті:
Вхідні дані
Стандартний 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.
Чи є кодування 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). Це працює, оскільки кількість символів заповнення є детермінованою з довжини рядка.