เก็บ API key และรหัสผ่านให้ปลอดภัยด้วย secrets ของโปรเจกต์

ตั้งค่าลับในแท็บตั้งค่าแอปหรือให้ AI ตั้งให้ ค่าที่ระบบเขียนให้เอง ทำไมต้องเผยแพร่ใหม่หลังแก้ และกับดัก key ในโค้ดหน้าเว็บกับ .env ใน ZIP
เว็บที่ AI ทำให้เริ่มเก่งขึ้น ต่อ LINE ได้ ส่งอีเมลได้ เรียก AI อีกตัวได้ แต่ทุกอย่างต้องใช้ API key หรือรหัสผ่าน แล้วคำถามก็ตามมา ว่าจะเก็บไว้ตรงไหน AI หลายตัววางรหัสไว้ในโค้ดตรง ๆ หรือแนบไฟล์ .env มาใน ZIP ซึ่งเสี่ยงหลุดโดยไม่รู้ตัว
บทความนี้อธิบายวิธีเก็บ API key และรหัสผ่านให้ปลอดภัยด้วย ค่าตั้งแอป (secrets) ของโปรเจกต์บน BrewInTH ตั้งแต่ตั้งค่าเอง ให้ AI ตั้งให้ ค่าที่ระบบเขียนให้อัตโนมัติ จนถึงกับดักที่คนพลาดบ่อยที่สุด
สรุปสั้นก่อนอ่าน
✅ ค่าลับเก็บที่แท็บ ตั้งค่าแอป ของโปรเจกต์ ถูกเข้ารหัสเมื่อเก็บ และส่งให้แอปเป็นตัวแปรสภาพแวดล้อม (environment variable)
✅ แก้ค่าแล้วต้อง เผยแพร่อีกครั้ง แอปจึงเห็นค่าใหม่
✅ ฐานข้อมูล Redis และอีเมลของแอป ระบบเขียนค่าเชื่อมต่อให้เอง ไม่ต้องคัดลอกรหัสเอง
✅ key ที่อยู่ในโค้ดหน้าเว็บ (front-end) ทุกคนเปิดดูได้ key ที่ต้องเป็นความลับต้องใช้จากฝั่งเซิร์ฟเวอร์เท่านั้น
✅ อย่าใส่.envตัวจริงใน ZIP และอย่าให้ AI เขียนรหัสลงในโค้ด
secrets คืออะไร ทำไมไม่เขียนไว้ในโค้ด
secret คือค่าที่แอปต้องใช้แต่ไม่ควรมีใครเห็น เช่น รหัสผ่านฐานข้อมูล API key ของบริการชำระเงิน token ของ LINE หรือคีย์ที่ใช้เซ็น session
ถ้าเขียนไว้ในโค้ด ค่านั้นจะไปทุกที่ที่โค้ดไป: ไฟล์ ZIP ที่ส่งต่อกัน repository บน GitHub ภาพหน้าจอที่ถามเพื่อน หรือแชตที่ส่งให้ AI อีกตัว พอหลุดแล้วต้องเปลี่ยน key ทุกที่ที่ใช้
วิธีที่ถูกคือแยกค่าออกจากโค้ด โค้ดอ่านค่าจาก ตัวแปรสภาพแวดล้อม เช่น process.env.LINE_TOKEN (Node), os.environ["LINE_TOKEN"] (Python) หรือ getenv('LINE_TOKEN') (PHP) ส่วนค่าจริงเก็บไว้ที่ BrewInTH

ตั้งค่าลับเองในคอนโซล
- เปิดโปรเจกต์ ไปที่แท็บ ตั้งค่าแอป หาส่วน ค่าตั้งแอป
- ช่อง ชื่อค่า ใส่ชื่อตัวพิมพ์ใหญ่ เช่น
LINE_CHANNEL_TOKEN - ช่อง ค่า วางค่าจริง แล้วกด บันทึก
- ค่าที่มีอยู่แล้วแก้ได้ด้วยปุ่ม แก้ไข
กฎของชื่อ: ขึ้นต้นด้วยตัวอักษรภาษาอังกฤษพิมพ์ใหญ่ ตามด้วยตัวพิมพ์ใหญ่ ตัวเลข หรือ _ ยาวไม่เกิน 64 ตัว ชื่อบางชื่อที่ระบบใช้เองตั้งไม่ได้ เช่น PATH และ NODE_OPTIONS
สิ่งที่ควรรู้: ในหน้านี้ เจ้าของโปรเจกต์เห็นค่าทุกค่าเป็นตัวหนังสือปกติ เพื่อให้ตรวจและแก้ได้ง่าย ระวังตอนแชร์หน้าจอ ประชุมออนไลน์ หรือถ่ายภาพหน้าจอไปถามใคร ให้ปิดแท็บนี้ก่อน
ให้ AI ตั้งค่าให้
ถ้าใช้ coding agent กับลิงก์และ token ของ BrewInTH ไม่ต้องคัดลอกทีละค่าเอง บอก AI แบบนี้
แอปนี้ต้องใช้ LINE_CHANNEL_TOKEN และ OPENAI_API_KEY
- ห้ามเขียนค่าจริงลงในโค้ดหรือไฟล์ที่อัปโหลด ให้โค้ดอ่านจาก environment variable
- ตั้งค่าทั้งสองเป็น secrets ของโปรเจกต์บน BrewInTH ฉันจะวางค่าให้ในข้อความถัดไป
- ทำไฟล์ .env.example ที่มีแต่ชื่อ ไม่มีค่าจริง
- ตั้งเสร็จแล้วเผยแพร่ใหม่ และตรวจว่าแอปอ่านค่าได้ โดยไม่พิมพ์ค่าออกมาใน log หรือในแชต
AI ตั้งค่าผ่านสิทธิ์ ตั้งค่าตัวแปรลับ เช่น DB_PASSWORD ส่วนสิทธิ์ ดูค่าตั้งแอปทั้งหมด ทำให้ AI อ่านค่ากลับได้ด้วย token จากปุ่ม สร้างลิงก์และ token สำหรับ AI (อัตโนมัติ) มีทั้งสองสิทธิ์ ถ้างานไม่ต้องอ่านค่า ให้ออก token ด้วย เลือกสิทธิ์เอง แล้วไม่ติ๊กสิทธิ์ดูค่า ดูวิธีในบทความตั้งค่า coding agent
ถ้าต้องการลบชื่อค่าที่ไม่ใช้แล้ว ให้ AI ที่มีสิทธิ์ตั้งค่าตัวแปรลับลบให้ ค่าที่ลบจะหายจากแอปจริงในการเผยแพร่ครั้งถัดไป
ค่าที่ระบบเขียนให้เอง
หลายค่าไม่ต้องตั้งเลย BrewInTH เขียนให้เมื่อสร้างหรือเชื่อมบริการ

- PostgreSQL:
DATABASE_URL, ชุดDB_HOSTDB_PORTDB_DATABASEDB_USERNAMEDB_PASSWORDและPGHOSTPGUSERPGPASSWORD… - MySQL / MariaDB:
MYSQL_URL, ชุดDB_*เดียวกัน และMYSQL_HOSTMYSQL_USERMYSQL_PASSWORD… - MongoDB:
MONGODB_URL,MONGODB_URI,MONGO_URL,MONGO_URI - Redis:
REDIS_URL,REDIS_HOST,REDIS_PORT,REDIS_PASSWORD - อีเมลของแอป: ในหน้าอีเมล กด *ใช้กับแอป (เขียน MAIL_ ให้)** ระบบเขียน
MAIL_HOST,MAIL_USERNAME,MAIL_PASSWORDและค่าที่เกี่ยวข้องให้ด้วยรหัสใหม่
เลือกฐานข้อมูลแบบไหนดี อ่านต่อในบทความเลือกฐานข้อมูล
แก้ค่าแล้ว ต้องเผยแพร่อีกครั้ง
แอปอ่านค่าลับครั้งเดียวตอนเริ่มทำงาน แก้ค่าในคอนโซลแล้วแอปที่รันอยู่ยังใช้ค่าเดิมจนกว่าจะเผยแพร่ใหม่ ทำได้สองทาง
- ในแท็บ การเผยแพร่ เลือกไฟล์ ZIP ล่าสุด แล้วกด Build และเผยแพร่
- หรือบอก AI ในแชตเดิมว่า "ฉันแก้ค่าในตั้งค่าแอปแล้ว ช่วยเผยแพร่ใหม่ด้วยค่าล่าสุด"
ข้อดีคือการเปลี่ยน key (เช่น key เดิมหลุด) ไม่ต้องแก้โค้ดเลย เปลี่ยนค่าแล้วเผยแพร่ใหม่ก็จบ
กับดักที่พบบ่อย

1. key ในโค้ดหน้าเว็บ ทุกคนเห็น
โค้ดที่รันในเบราว์เซอร์ (HTML, JavaScript ของ React, Vue หรือหน้าเว็บ static) ถูกส่งไปให้ผู้เข้าชมทุกคน ใครก็กด "ดูซอร์ส" แล้วเห็น key ได้ ตัวแปรแบบ VITE_… หรือ NEXT_PUBLIC_… ก็ถูกฝังลงไฟล์ JavaScript ตอน build เช่นกัน
กฎ: key ที่เสียเงินได้หรือเปิดข้อมูลได้ (เช่น key ของบริการ AI บริการชำระเงิน หรือ token ของ LINE) ต้องใช้ใน โค้ดฝั่งเซิร์ฟเวอร์ เท่านั้น ให้ AI ทำ API เล็ก ๆ ในแอป หน้าเว็บเรียก API ของคุณ แล้ว API ค่อยเรียกบริการภายนอกด้วย key
2. เว็บ static ไม่มีที่เก็บความลับ
เว็บที่มีแต่ HTML CSS JavaScript ไม่มีโปรแกรมฝั่งเซิร์ฟเวอร์ ค่าตั้งแอปจึงไม่มีประโยชน์กับเว็บแบบนี้ ถ้าต้องใช้ key ลับ ต้องทำเป็นแอป เช่น Node หรือ Python ที่มีส่วน API
3. ไฟล์ .env ใน ZIP
ถ้าอัปโหลด ZIP ที่มี .env อยู่ ตอนตรวจความพร้อมก่อนเผยแพร่จะมีคำเตือนให้ตั้งค่าลับผ่าน "ตั้งค่าแอป" แทน ทำตามนั้น ลบ .env ออกจาก ZIP แล้วเก็บไว้แค่ .env.example ที่มีแต่ชื่อ
ส่วนหน้า อัปโหลดแล้วขึ้นเว็บ (BETA) จัดการให้เอง ค่าใน .env ที่รากโปรเจกต์ถูกเก็บเป็น secrets ของโปรเจกต์ และไฟล์นั้นไม่ถูกอัปโหลด
4. ค่าลับใช้ได้ตอนแอปรัน ไม่ใช่ตอน build
ขั้น build ไม่ได้รับค่าลับของโปรเจกต์ ค่าที่ต้องใช้ตอน build เช่น VITE_API_URL ต้องอยู่ในไฟล์ของโปรเจกต์ (เช่น .env.production) และต้องเป็นค่าที่เปิดเผยได้อยู่แล้ว ค่าลับจริงให้แอปอ่านตอนทำงาน
ความปลอดภัยที่ BrewInTH ทำให้
- ค่าลับถูก เข้ารหัสเมื่อเก็บ (AES-256-GCM)
- การอ่านและแก้ค่าถูกบันทึกไว้เฉพาะ ชื่อ ของค่า ไม่บันทึกตัวค่า
- ค่าแยกต่อโปรเจกต์ โปรเจกต์อื่นในบัญชีอ่านไม่ได้
- token ของ AI ที่อ่านค่าลับได้ ต้องออกโดยเจ้าของบัญชีเท่านั้น
คำถามที่พบบ่อย
key หลุดไปแล้ว ทำยังไง
ไปที่บริการเจ้าของ key (เช่น หน้าจัดการ API key ของผู้ให้บริการ) ยกเลิก key เดิมและสร้างใหม่ทันที แล้วแก้ค่าใน ตั้งค่าแอป และเผยแพร่อีกครั้ง ถ้า key เคยอยู่ใน repository ให้ถือว่าหลุดแล้วแม้จะลบออกภายหลัง
เก็บค่าลับได้ยาวแค่ไหน
ค่าหนึ่งค่ายาวได้ถึง 32,768 ตัวอักษร พอสำหรับ private key หรือไฟล์ JSON ของ service account
วางไฟล์ .env ทั้งไฟล์ทีเดียวได้ไหม
ในคอนโซลตั้งได้ทีละค่า ถ้ามีหลายค่า ให้ coding agent ตั้งให้ครั้งเดียวทั้งชุด หรือใช้หน้า อัปโหลดแล้วขึ้นเว็บ ซึ่งอ่าน .env ในไฟล์ที่ส่งให้เอง อย่าส่งค่าลับของระบบอื่นที่ไม่เกี่ยวกับแอปนี้ให้ AI
ต้องส่งค่าลับให้ทีมงานตอนขอความช่วยเหลือไหม
ค่าถูกเข้ารหัสเมื่อเก็บ ถ้าต้องให้ทีมงานช่วยแก้ปัญหา ไม่ต้องส่งค่าลับมาในแชต บอกแค่ชื่อค่าก็พอ
ตัวแปรที่ไม่ใช่ความลับ ตั้งที่เดียวกันได้ไหม
ได้ เช่น APP_ENV หรือ TIMEZONE ใช้หน้าเดียวกัน แอปอ่านแบบเดียวกัน
สรุป
ค่าลับไม่ควรอยู่ในโค้ด ไม่ควรอยู่ใน ZIP และไม่ควรอยู่ในโค้ดหน้าเว็บ ให้โค้ดอ่านจากตัวแปรสภาพแวดล้อม เก็บค่าจริงที่แท็บ ตั้งค่าแอป หรือให้ AI ตั้งให้ ค่าฐานข้อมูลและอีเมลปล่อยให้ระบบเขียนเอง และทุกครั้งที่แก้ค่า อย่าลืมเผยแพร่อีกครั้ง
