Base64 URL-safe
Кодування та декодування URL-безпечного Base64 (Base64url)
Звичайний текст
Base64
Що таке кодування Base64url?
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
Стандартний 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== | |
| 1+1=2 | MSsxPTI= | MSsxPTI |
| subject?ref=1 | c3ViamVjdD9yZWY9MQ== | c3ViamVjdD9yZWY9MQ |
| ð (thumbs up) | 8J+RjQ== | 8J-RjQ |
Приклади коду
Як кодувати та декодувати рядки Base64url у популярних мовах. Кожен приклад створює вивід, безпечний для використання в URL, іменах файлів і HTTP-заголовках:
// Encode to Base64url
function toBase64url(str) {
return btoa(unescape(encodeURIComponent(str)))
.replace(/\+/g, '-')
.replace(/\//g, '_')
.replace(/=+$/, '')
}
toBase64url('Hello!') // → "SGVsbG8h"
// Decode from Base64url
function fromBase64url(b64url) {
const b64 = b64url.replace(/-/g, '+').replace(/_/g, '/')
const pad = (4 - b64.length % 4) % 4
return decodeURIComponent(escape(atob(b64 + '='.repeat(pad))))
}
fromBase64url('SGVsbG8h') // → "Hello!"// Native base64url support since Node 15.7
const encoded = Buffer.from('Hello!').toString('base64url')
// → "SGVsbG8h"
const decoded = Buffer.from('SGVsbG8h', 'base64url').toString()
// → "Hello!"
// Decode a JWT payload
const jwt = 'eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0...'
const payload = JSON.parse(Buffer.from(jwt.split('.')[1], 'base64url').toString())
// → { sub: "1234567890" }import base64
# Encode to Base64url (no padding)
encoded = base64.urlsafe_b64encode(b'Hello!').rstrip(b'=').decode()
# → "SGVsbG8h"
# Decode from Base64url (re-add padding)
def b64url_decode(s: str) -> bytes:
s += '=' * (4 - len(s) % 4) # restore padding
return base64.urlsafe_b64decode(s)
b64url_decode('SGVsbG8h') # → b'Hello!'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!"
}