DevToolBoxฟรี
บล็อก

Base64 Encoding ในทางปฏิบัติ: 7 การใช้งานจริงที่นักพัฒนาทุกคนควรรู้

8 นาทีในการอ่านโดย DevToolBox
Ad Space

Base64 มีอยู่ทุกหนแห่งในการพัฒนาเว็บ แต่บทเรียนส่วนใหญ่อธิบายเพียงว่ามันทำงานอย่างไร บทความนี้เน้นที่ 7 สถานการณ์จริง ที่คุณจะใช้การเข้ารหัส Base64 จริง ๆ ในงานพัฒนาประจำวัน พร้อมตัวอย่างโค้ดที่สามารถคัดลอกได้โดยตรง

ลองใช้เครื่องมือเข้ารหัส/ถอดรหัส Base64 ของเรา →

1. ฝังรูปภาพใน HTML/CSS (Data URI)

Data URI ช่วยให้คุณฝังรูปภาพขนาดเล็กลงใน HTML หรือ CSS โดยตรง ลดการร้องขอ HTTP ลงหนึ่งครั้ง ซึ่งมีประโยชน์อย่างยิ่งสำหรับไอคอน โลโก้ และองค์ประกอบ UI ขนาดเล็ก

<!-- Embed a small icon directly in HTML -->
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEU..." alt="icon" />

/* Embed in CSS */
.icon {
  background-image: url('data:image/svg+xml;base64,PHN2Zy...');
}

เมื่อใดควรใช้: รูปภาพขนาดต่ำกว่า 10KB (ไอคอน โลโก้ขนาดเล็ก องค์ประกอบ UI)

เมื่อใดไม่ควรใช้: รูปภาพขนาดเกิน 10KB — การเพิ่มขนาด 33% มีน้ำหนักมากกว่าการประหยัดคำขอ HTTP

// Node.js: Convert image file to Base64 data URI
const fs = require('fs');
const imageBuffer = fs.readFileSync('icon.png');
const base64 = imageBuffer.toString('base64');
const dataUri = `data:image/png;base64,${base64}`;
console.log(dataUri);

แปลงรูปภาพเป็น Base64 ด้วยเครื่องมือเข้ารหัสของเรา →

2. โครงสร้าง JWT Token

JSON Web Token (JWT) ใช้ การเข้ารหัส Base64URL (ตัวแปรที่ปลอดภัยสำหรับ URL) สำหรับสามส่วน: header, payload และ signature การเข้าใจสิ่งนี้เป็นสิ่งจำเป็นสำหรับการดีบักปัญหาการยืนยันตัวตน

// A JWT token:
// eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiam9obiJ9.signature
//  ^^^^^ header ^^^^^   ^^^^^ payload ^^^^^

// Decoding the header (Base64URL → JSON):
atob('eyJhbGciOiJIUzI1NiJ9');
// → '{"alg":"HS256"}'

// Decoding the payload:
atob('eyJ1c2VyIjoiam9obiJ9');
// → '{"user":"john"}'

จุดสำคัญ: JWT token ไม่ได้เข้ารหัสลับ ใครก็สามารถถอดรหัส header และ payload ได้ด้วยการถอดรหัส Base64 อย่างง่าย signature ตรวจสอบความสมบูรณ์ ไม่ใช่ความลับ

ถอดรหัส JWT token ด้วย JWT Decoder ของเรา →

3. Kubernetes Secrets

Kubernetes เก็บค่าลับในรูปแบบสตริงที่เข้ารหัส Base64 ในไฟล์ YAML manifest นี่เป็นหนึ่งในกรณีการใช้งาน Base64 ที่พบบ่อยที่สุดใน DevOps

# Creating a Kubernetes Secret
apiVersion: v1
kind: Secret
metadata:
  name: db-credentials
type: Opaque
data:
  DB_PASSWORD: c3VwZXItc2VjcmV0  # echo -n 'super-secret' | base64
  DB_USER: YWRtaW4=              # echo -n 'admin' | base64
# Encode a value for Kubernetes secrets
echo -n 'my-password' | base64
# → bXktcGFzc3dvcmQ=

# Decode a Kubernetes secret value
echo -n 'bXktcGFzc3dvcmQ=' | base64 --decode
# → my-password

# IMPORTANT: Always use -n with echo to avoid trailing newline!

คำเตือนด้านความปลอดภัย: Base64 ใน Kubernetes Secrets มีไว้สำหรับการเข้ารหัส (encoding) ไม่ใช่การเข้ารหัสลับ (encryption) ใช้โซลูชันเช่น Sealed Secrets, External Secrets หรือ Vault สำหรับความปลอดภัยที่แท้จริง

4. Payload คำขอ/การตอบกลับ API

เมื่อ API ต้องส่งข้อมูลไบนารี (รูปภาพ ไฟล์ ใบรับรอง) ภายใน JSON payload การเข้ารหัส Base64 เป็นวิธีมาตรฐาน เนื่องจาก JSON รองรับเฉพาะข้อความ

// Uploading an image via API
const fileInput = document.getElementById('avatar');
const file = fileInput.files[0];

const reader = new FileReader();
reader.onload = async () => {
  const base64 = reader.result.split(',')[1]; // Remove data URI prefix

  await fetch('/api/upload-avatar', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      filename: file.name,
      data: base64,        // Base64-encoded file content
      contentType: file.type,
    }),
  });
};
reader.readAsDataURL(file);

5. การยืนยันตัวตน HTTP Basic

รูปแบบการยืนยันตัวตน HTTP Basic ส่งข้อมูลรับรองเป็นสตริงที่เข้ารหัส Base64 ในส่วนหัว Authorization ซึ่งยังคงใช้ใน API จำนวนมาก

// Constructing Basic Auth header
const username = 'admin';
const password = 'secret123';
const credentials = btoa(`${username}:${password}`);
// → "YWRtaW46c2VjcmV0MTIz"

// Using in fetch
fetch('https://api.example.com/data', {
  headers: {
    'Authorization': `Basic ${credentials}`,
  },
});

// curl equivalent
// curl -u admin:secret123 https://api.example.com/data
// (curl Base64-encodes automatically with -u)

ใช้ HTTPS เสมอกับ Basic Auth ผ่าน HTTP แบบไม่เข้ารหัสลับ ข้อมูลรับรอง Base64 สามารถถูกถอดรหัสได้ง่าย ๆ โดยใครก็ตามที่ดักจับทราฟฟิก

6. ไฟล์แนบอีเมล (MIME)

โปรโตคอลอีเมล (SMTP) ถูกออกแบบมาสำหรับข้อความ ASCII เท่านั้น ไฟล์แนบไบนารี — รูปภาพ, PDF, เอกสาร — จะถูกเข้ารหัส Base64 ก่อนรวมในข้อความอีเมลผ่าน MIME

// Node.js: Sending email with attachment (nodemailer)
const nodemailer = require('nodemailer');
const fs = require('fs');

const pdfBuffer = fs.readFileSync('report.pdf');

await transporter.sendMail({
  from: 'sender@example.com',
  to: 'recipient@example.com',
  subject: 'Monthly Report',
  attachments: [
    {
      filename: 'report.pdf',
      content: pdfBuffer,
      // nodemailer handles Base64 encoding internally
      encoding: 'base64',
    },
  ],
});

เบื้องหลัง ข้อความ MIME มีลักษณะดังนี้:

Content-Type: application/pdf
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="report.pdf"

JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMg
MCBSPj4Kc3RyZWFtCkJUCi9GMS...

7. จัดเก็บข้อมูลไบนารีในระบบข้อความเท่านั้น

บางระบบ — ตัวแปรสภาพแวดล้อม, ไฟล์คอนฟิก JSON, การส่งออก CSV — รองรับเฉพาะข้อความ Base64 ช่วยให้คุณฝังข้อมูลไบนารีได้อย่างปลอดภัยในบริบทข้อความเท่านั้นเหล่านี้

# .env file: Store SSL certificate as Base64
SSL_CERT=LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0t...
SSL_KEY=LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0t...

# In your application:
# const cert = Buffer.from(process.env.SSL_CERT, 'base64');
// Storing binary config in JSON
{
  "favicon": "iVBORw0KGgoAAAANSUhEUgAAA...",
  "sslCert": "LS0tLS1CRUdJTiBDRVJUSUZJ..."
}

รูปแบบนี้ใช้กันทั่วไปในแพลตฟอร์มคลาวด์ (Heroku, Railway, Fly.io) ที่ตัวแปรสภาพแวดล้อมเป็นกลไกการกำหนดค่าหลัก

Base64 เทียบกับ Base64URL

Base64 มาตรฐานใช้ + และ / ซึ่งไม่ปลอดภัยใน URL Base64URL แทนที่ด้วย - และ _:

ตัวแปรตัวอักษรการเติมใช้ใน
Base64A-Z, a-z, 0-9, +, /การเติม =อีเมล, Data URI, K8s Secrets
Base64URLA-Z, a-z, 0-9, -, _ไม่มีการเติมJWT token, พารามิเตอร์ URL

อ้างอิงด่วน: คำสั่ง Base64

# Encode a string
echo -n 'Hello World' | base64
# → SGVsbG8gV29ybGQ=

# Decode a string
echo -n 'SGVsbG8gV29ybGQ=' | base64 --decode
# → Hello World

# Encode a file
base64 < input.bin > output.txt

# Decode a file
base64 --decode < encoded.txt > output.bin

# JavaScript (browser)
btoa('Hello World')        // encode
atob('SGVsbG8gV29ybGQ=')  // decode

# Python
import base64
base64.b64encode(b'Hello World')
base64.b64decode(b'SGVsbG8gV29ybGQ=')

เข้ารหัสและถอดรหัส Base64 ทันทีด้วยเครื่องมือของเรา →

คำถามที่พบบ่อย

การเข้ารหัส Base64 เหมือนกับการเข้ารหัสลับหรือไม่?

ไม่ Base64 เป็นรูปแบบการเข้ารหัส (encoding) ไม่ใช่การเข้ารหัสลับ (encryption) ใครก็สามารถถอดรหัสข้อมูล Base64 ได้ — ไม่ได้ให้ความปลอดภัย Base64 ถูกออกแบบมาสำหรับการขนส่งข้อมูลอย่างปลอดภัยผ่านช่องทางข้อความเท่านั้น ไม่ใช่สำหรับปกป้องข้อมูลที่สำคัญ

ทำไม Base64 ถึงเพิ่มขนาดข้อมูลประมาณ 33%?

Base64 แปลง 3 ไบต์ของข้อมูลไบนารีเป็น 4 ตัวอักษร ASCII (6 บิตต่อตัวอักษรแทนที่จะเป็น 8) อัตราส่วน 3:4 นี้หมายความว่าข้อมูลที่เข้ารหัส Base64 มีขนาดใหญ่กว่าข้อมูลไบนารีเดิมประมาณ 33% สิ่งที่ได้แลกมาคือความเข้ากันได้กับข้อความอย่างสากล

เมื่อใดที่ไม่ควรใช้ Base64?

หลีกเลี่ยง Base64 สำหรับไฟล์ขนาดใหญ่ (รูปภาพเกิน 10KB วิดีโอ เอกสาร) เนื่องจากจะเพิ่มขนาด payload อย่างมาก หลีกเลี่ยงสำหรับการจัดเก็บระยะยาวในฐานข้อมูลด้วย — ใช้คอลัมน์ไบนารี (BLOB/BYTEA) แทน Base64 เหมาะที่สุดสำหรับข้อมูลขนาดเล็กที่เดินทางผ่านช่องทางข้อความเท่านั้น

ลองเครื่องมือที่เกี่ยวข้อง

B64Base64 Encoder/DecoderJWTJWT Decoder
Ad Space

บทความที่เกี่ยวข้อง

UUID v4 vs UUID v7 vs ULID vs NanoID: คุณควรใช้ ID แบบไหน?

เปรียบเทียบ UUID v4, UUID v7, ULID และ NanoID สำหรับ primary key ฐานข้อมูล ระบบกระจาย และแอปพลิเคชัน frontend