🔐
← กลับไปคู่มือ

การเข้ารหัส Base64 URL Safe: มันคืออะไรและทำไมถึงสำคัญ

· แท็ก: base64, url-safe, base64url, jwt, encoding, web-development, api

การเข้ารหัส Base64 แบบปลอดภัยสำหรับ URL คืออะไร?

การเข้ารหัส Base64 แบบปลอดภัยสำหรับ URL (เรียกอีกอย่างว่า Base64url) เป็นรูปแบบย่อยของ Base64 มาตรฐานที่แทนที่อักขระที่มีความหมายพิเศษใน URL และชื่อไฟล์ด้วยทางเลือกที่ปลอดภัย Base64 มาตรฐานใช้ + และ / เป็นส่วนหนึ่งของชุดอักขระ 64 ตัว รวมถึง = สำหรับ padding และทั้งสามตัวมีปัญหาใน URL, query strings และพาธไฟล์

Base64url แก้ปัญหานี้ด้วยการแทนที่ง่ายๆ สองอย่าง:

| Base64 มาตรฐาน | Base64 แบบปลอดภัยสำหรับ URL | |-----------------|-----------------| | + (บวก) | - (ลบ) | | / (เครื่องหมายทับ) | _ (ขีดล่าง) | | = (padding) | ถูกละไว้ (โดยปกติ) |

ทำไม Base64 มาตรฐานทำให้ URL เสียหาย

เมื่อสตริงที่เข้ารหัส Base64 ที่มี + หรือ / ปรากฏใน URL พฤติกรรมของเบราว์เซอร์และเซิร์ฟเวอร์จะไม่สามารถคาดเดาได้

ปัญหาของ +

ใน URL query strings อักขระ + ถูกตีความเป็นช่องว่าง (space) พฤติกรรมนี้มาจากข้อกำหนด application/x-www-form-urlencoded และทำให้ข้อมูลที่ถอดรหัสมีช่องว่างที่ไม่คาดคิด

ตัวอย่างเช่น สตริง Base64 อย่าง Pj4+Pz8/Pw== มีอักขระ + หากสิ่งนี้ปรากฏในพารามิเตอร์ URL ?token=Pj4+Pz8/Pw== เซิร์ฟเวอร์จะเห็น ?token=Pj4 Pz8/Pw==+ กลายเป็นช่องว่าง

ปัญหาของ /

ใน URL paths อักขระ / เป็นตัวคั่นพาธ สตริง Base64 อย่าง ab/CD+Ef== มี / ที่จะถูกตีความเป็นระดับไดเรกทอรี หากสิ่งนี้ปรากฏในส่วนของ URL ทั้งไคลเอนต์และเซิร์ฟเวอร์อาจตีความโครงสร้างผิด

ปัญหาของ =

อักขระ = ใช้สำหรับคู่ key-value ใน query strings เครื่องหมาย = ที่ต่อท้ายใน ?data=SGVsbG8= อาจคลุมเครือ — = เป็นส่วนหนึ่งของ Base64 padding หรือไวยากรณ์ของ query parameter?

ในขณะที่การเข้ารหัสเปอร์เซ็นต์ (percent-encoding) สามารถแก้ไขปัญหาเหล่านี้ได้ (+ กลายเป็น %2B, / กลายเป็น %2F) มันทำให้ความยาวสตริงเพิ่มขึ้นและทำให้การดีบักยากขึ้น Base64url เป็นโซลูชันที่สะอาดกว่า

Base64url ทำงานอย่างไร

Base64url ถูกกำหนดอย่างเป็นทางการใน RFC 4648 Section 5 มันใช้อัลกอริทึมเดียวกันกับ Base64 มาตรฐาน — 3 ไบต์กลายเป็น 4 อักขระ — แต่มีการแทนที่อักขระหนึ่งตัวที่ตำแหน่ง 62 และ 63 ของชุดอักขระ:

  • ดัชนีชุดอักขระ 62: +- (ลบ)
  • ดัชนีชุดอักขระ 63: /_ (ขีดล่าง)

Padding (=) มักถูกตัดออก เนื่องจากสามารถอนุมานได้จากความยาวสตริงเมื่อถอดรหัส สตริง Base64url เป็นส่วนประกอบ URL ที่ถูกต้องเสมอโดยไม่ต้อง escape เพิ่มเติม

ก่อนและหลัง

นี่คือสิ่งที่ข้อมูลไบนารีเดียวกันดูเหมือนในทั้งสองรูปแบบ:

Standard:  Pj4+Pz8/Pw==
URL-safe:  Pj4-Pz8_Pw

ที่ที่ Base64url ถูกใช้

JSON Web Tokens (JWT)

JWT เป็นผู้ใช้ Base64url ที่โดดเด่นที่สุด ทุก JWT ประกอบด้วยสามส่วน — header, payload และ signature — แต่ละส่วนถูกเข้ารหัสด้วย Base64 แบบปลอดภัยสำหรับ URL และคั่นด้วยจุด:

eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNqP0m2iTgCjD0

สังเกตเครื่องหมายขีดและขีดล่าง — ไม่มีเครื่องหมายบวกหรือเครื่องหมายทับ หาก JWT ใช้ Base64 มาตรฐาน โทเค็นจะเสียหายเมื่อส่งผ่านเป็นพารามิเตอร์ URL ซึ่งเป็นวิธีที่ใช้บ่อยที่สุดในเว็บแอปพลิเคชัน

OAuth และ OpenID Connect

ทั้ง OAuth 2.0 และ OpenID Connect พึ่งพา JWT สำหรับ access tokens และ ID tokens ทำให้การเข้ารหัส Base64url เป็นพื้นฐานสำหรับการยืนยันตัวตนสมัยใหม่ authorization code flow, implicit flow และ client credentials flow ต่างก็ส่งโทเค็นที่ใช้ Base64url

Web API และ Query Parameters

REST และ GraphQL API จำนวนมากรับข้อมูลที่เข้ารหัส Base64 ใน query parameters สำหรับ pagination cursors, ตัวกรอง หรือ payload ที่เข้ารหัส Base64url ทำให้แน่ใจว่าพารามิเตอร์เหล่านี้ทำงานได้อย่างถูกต้องโดยไม่ต้องเข้ารหัส URL เพิ่มเติม

ตัวอย่างจากโลกจริง — API cursor pagination:

GET /api/users?cursor=MjAyNC0wMS0xNVQxMDozMDowMFo

GitHub's API ใช้รูปแบบนี้สำหรับการแบ่งหน้าชุดผลลัพธ์ขนาดใหญ่

ชื่อไฟล์และการจัดเก็บไฟล์

สตริง Base64url เป็นชื่อไฟล์ที่ปลอดภัยเพราะไม่มีตัวคั่นพาธ (/), ไม่มีอักขระพิเศษที่ทำให้ระบบไฟล์สับสน และไม่มีอักขระที่ไม่ถูกต้องบน Windows (:, *, ? ฯลฯ)

Content Delivery Networks และ Cache Keys

CDN และชั้นแคชมักใช้ค่าที่เข้ารหัส Base64url เป็น cache keys Base64 มาตรฐานที่มี / จะสร้างลำดับชั้นไดเรกทอรีปลอมใน namespace ของแคช นำไปสู่ keys ที่คลุมเครือ

การแปลงระหว่าง Base64 มาตรฐานและ Base64url

การแปลงระหว่างสองรูปแบบย่อยนั้นตรงไปตรงมาในทุกภาษา:

JavaScript

// Standard Base64 to URL-safe Base64
function base64ToBase64url(base64) {
  return base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
}

// URL-safe Base64 to Standard Base64
function base64urlToBase64(base64url) {
  let result = base64url.replace(/-/g, '+').replace(/_/g, '/');
  // Restore padding
  while (result.length % 4) {
    result += '=';
  }
  return result;
}

Node.js

Node.js รองรับ Base64url โดยตรงตั้งแต่เวอร์ชัน 15.7.0:

// Encode to Base64url
const encodedUrl = Buffer.from('Hello, world!').toString('base64url');
console.log(encodedUrl);
// Output: SGVsbG8sIHdvcmxkIQ

// Decode from Base64url
const decoded = Buffer.from(encodedUrl, 'base64url').toString('utf-8');
console.log(decoded);
// Output: Hello, world!

Python

import base64

# Encode to Base64url
encoded = base64.urlsafe_b64encode(b"Hello, world!")
print(encoded.decode())
# Output: SGVsbG8sIHdvcmxkIQ==

# Decode from Base64url
decoded = base64.urlsafe_b64decode(encoded)
print(decoded.decode())
# Output: Hello, world!

เมื่อใดควรใช้ Base64 มาตรฐาน เทียบกับ Base64url

ใช้ Base64 มาตรฐานเมื่อ:

  • เข้ารหัสไฟล์แนบอีเมล (มาตรฐาน MIME ต้องการ)
  • สร้าง data URLs สำหรับการฝังใน HTML/CSS
  • จัดเก็บข้อมูลในฐานข้อมูลที่ความปลอดภัยของ URL ไม่เกี่ยวข้อง
  • โต้ตอบกับระบบเก่าที่คาดหวัง Base64 มาตรฐาน

ใช้ Base64url เมื่อ:

  • สร้างหรือ parse JWT tokens
  • ส่งข้อมูลที่เข้ารหัสใน URL query parameters หรือ path segments
  • สร้างชื่อไฟล์จากข้อมูลไบนารี
  • สร้าง cache keys หรือ identifiers
  • ทำงานกับ OAuth tokens หรือ OpenID Connect

ลองใช้การเข้ารหัส Base64 แบบปลอดภัยสำหรับ URL ออนไลน์

ใช้ เครื่องมือเข้ารหัสและถอดรหัส Base64 ออนไลน์ฟรี เพื่อแปลงระหว่างรูปแบบ Base64 มาตรฐานและ Base64 แบบปลอดภัยสำหรับ URL วางข้อมูลของคุณ เลือกรูปแบบย่อยที่ต้องการ และรับผลลัพธ์ทันที