Base64URL (“base64 with URL and filename safe alphabet”, RFC 4648 section 5) is standard Base64 with two characters replaced:
| Value | Standard | Base64URL |
|---|---|---|
| 62 | + |
- |
| 63 | / |
_ |
In URLs, + can mean a space and / separates path segments, and both are invalid in file names on some systems. - and _ have no special meaning anywhere.
Padding
The RFC allows omitting = when the length is known from context, and almost every user of Base64URL does so (because = would need to be percent-encoded as %3D in URLs). Decoders should therefore accept values with and without padding.
Where it is used
- JSON Web Tokens (JWT): header, payload and signature are unpadded Base64URL. Decode one with the JWT decoder.
- WebAuthn / passkeys, OAuth PKCE code challenges, and many API keys.
- URL query parameters and short IDs (for example YouTube video IDs use the same alphabet).
- File names generated from hashes.
Converting
| From → to | Steps |
|---|---|
| Base64 → Base64URL | replace + with -, / with _, remove = |
| Base64URL → Base64 | replace - with +, _ with /, append = until the length is a multiple of 4 |
Example: +/+/ ⇄ -_-_; SGk (Base64URL) → SGk= (Base64).
Use the Base64URL encoder and decoder, or convert existing values with normalization.
Code
// JavaScript
const toB64Url = (b64) => b64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
# Python
base64.urlsafe_b64encode(data).rstrip(b"=")
More examples: JavaScript, Python, PHP, Go.
Comments (0)
Questions, ideas or a bug in “Base64URL”? Leave a comment, rate the tool, or reply to others.
No comments yet. Be the first to share your feedback!