วิธีสร้าง CRON_SECRET สำหรับ Vercel Cron Jobs
อ่าน 8 นาทีอัปเดต 5 ตุลาคม 2569
วิธีสร้าง CRON_SECRET คือเปิด สร้าง Cron Secret จะได้ secret แบบสุ่มขนาด 256 บิตทันที กด คัดลอกเป็นบรรทัด .env แล้วเพิ่มเป็น environment variable ชื่อ CRON_SECRET บนโฮสต์ จากนั้นให้ cron route ปฏิเสธทุก request ที่ Authorization header ไม่ใช่ “Bearer” ตามด้วย secret นี้ ถ้าใช้ Vercel เมื่อตั้งตัวแปรแล้ว Vercel Cron จะส่ง header นี้ให้เอง
ใช้ฟรี ไม่ต้องสมัคร ทำงานในเบราว์เซอร์ secret สร้างจาก crypto.getRandomValues บนเครื่องของคุณและไม่ถูกบันทึกลงประวัติ นอกจากนี้ยังมีคำสั่งและโค้ด handler พร้อมวางสำหรับ Next.js, Express, Cloudflare Workers และ GitHub Actions
ทำทีละขั้นตอน
- 1เปิดเครื่องมือสร้าง Cron Secretเข้าเครื่องมือสร้าง Cron Secret แล้ว secret แบบ hex ขนาด 256 บิต (64 ตัวอักษร) จะถูกสร้างให้ทันทีที่เปิดหน้า
- 2เลือกรูปแบบและความแข็งแรงเลือก Hex, Base64url หรือ A–Z 0–9 และความแข็งแรง 128, 256, 384 หรือ 512 บิต สำหรับ cron job ทั่วไป 256 บิตก็เหลือเฟือ กด สร้างใหม่ (Ctrl/⌘ + Enter) ถ้าต้องการค่าใหม่
- 3ตั้งชื่อตัวแปรปล่อย ชื่อตัวแปร เป็น CRON_SECRET ถ้าใช้กับ Vercel Cron หรือเปลี่ยนชื่อได้ เช่น REPORT_JOB_SECRET คำสั่งและโค้ดด้านล่างจะเปลี่ยนตามให้อัตโนมัติ
- 4คัดลอกแล้วเก็บไว้กด คัดลอก หรือ คัดลอกเป็นบรรทัด .env แล้วในส่วน 1 · เก็บไว้ที่ไหน เลือกแท็บ .env, Vercel, GitHub หรือ Cloudflare เพื่อดูคำสั่งบันทึก secret บนแพลตฟอร์มนั้น
- 5ตรวจ secret ใน endpointในส่วน 2 · ตรวจสอบใน job ของคุณ คัดลอก handler ของ Next.js, Express, Worker หรือ GH Actions หรือ config ของ Vercel Cron แล้วใช้แท็บ curl ทดสอบ ถ้าไม่มี header ต้องได้ 401 และถ้ามีต้องได้ 200
ทำไม cron endpoint ต้องมี secret
cron job บน Vercel และโฮสต์ส่วนใหญ่ก็คือ HTTP route ธรรมดา เช่น /api/cron ที่ scheduler เรียกตามเวลา URL นี้เป็นสาธารณะ ใครเจอใน repo ใน log หรือเดาถูก ก็เรียกได้บ่อยเท่าที่ต้องการ ทั้งส่งอีเมลซ้ำ รัน job เก็บเงิน หรือยิงฐานข้อมูลจนหนัก
secret ที่รู้กันสองฝั่งช่วยแก้ปัญหานี้ scheduler ส่ง secret มากับทุกครั้งที่รัน และ route ปฏิเสธ request ที่ไม่มี secret เพราะ secret ยาวและสุ่มจริง การเดาจึงแทบเป็นไปไม่ได้
CRON_SECRET ทำงานบน Vercel อย่างไร
เพิ่ม environment variable ชื่อ CRON_SECRET ในโปรเจกต์ Vercel จากนั้น Vercel Cron จะใส่ Authorization header ค่า “Bearer ” ตามด้วย secret มากับทุก request ที่ตั้งเวลาไว้ ฝั่ง route อ่าน header นี้ เทียบกับ “Bearer ” ต่อด้วย process.env.CRON_SECRET และตอบ 401 ถ้าไม่ตรงกัน แท็บ Next.js ในเครื่องมือมี route handler นี้พร้อมวาง
ตารางเวลากำหนดใน crons ของ vercel.json แต่ละรายการมี path และ cron expression ข้อควรจำคือ cron expression บน Vercel ใช้เวลา UTC เช่น “0 5 * * *” จะรันตอนเที่ยงตรงเวลาไทย และ cron job จะถูกเรียกเฉพาะ production deployment เท่านั้น หลังเพิ่มหรือเปลี่ยนตัวแปร อย่าลืม redeploy เพื่อให้ค่าใหม่มีผล
ทริค: ใช้ เทียบเวลาต่างประเทศ แปลงเวลา UTC เป็นเวลาไทย (หรือเมืองอื่น) ก่อน commit ตารางเวลา
GitHub Actions, Cloudflare Workers และ Express
หลักการเดียวกันใช้ได้กับทุก scheduler ที่ส่ง header ได้ เครื่องมือมีตัวอย่างสำหรับกรณีที่ใช้บ่อย
- GitHub Actions — เก็บ secret เป็น repository secret แล้วให้ workflow ที่ตั้งเวลาไว้เรียก endpoint ด้วย curl พร้อม Bearer header
- Cloudflare Workers — Cron Trigger เรียก scheduled() handler ของ Worker โดยตรง ไม่ต้องใช้ secret แต่ถ้า fetch() handler รัน job ผ่าน HTTP ได้ด้วย ให้ใช้ secret ป้องกันส่วนนั้น
- Express — เทียบ header แบบ constant-time (timingSafeEqual) เพื่อไม่ให้ secret รั่วผ่านเวลาที่ใช้ตรวจ
เก็บ secret ให้ปลอดภัย
secret จะปลอดภัยแค่ไหนขึ้นกับว่าเก็บไว้ที่ใด กฎเหล่านี้ป้องกันการรั่วไหลได้เกือบทั้งหมด
- อย่า commit ขึ้น git ใส่ไฟล์ .env ไว้ใน .gitignore และเก็บค่าจริงไว้ในการตั้งค่า environment ของโฮสต์
- อย่าใส่ใน query string ของ URL เพราะจะไปโผล่ใน access log และประวัติเบราว์เซอร์ ส่งผ่าน header เสมอ
- ใน Next.js อย่าตั้งชื่อขึ้นต้นด้วย NEXT_PUBLIC_ เพราะค่าจะถูก bundle ไปกับโค้ดที่ส่งให้เบราว์เซอร์
- ใช้ secret แยกกันในแต่ละโปรเจกต์และ environment ถ้าจะเปลี่ยน (rotate) ให้สร้างค่าใหม่ อัปเดตทุกที่ แล้ว redeploy
คำถามที่พบบ่อย
- CRON_SECRET คืออะไร?
- รหัสลับที่ scheduler ส่งมากับทุกครั้งที่รัน มักอยู่ใน Authorization: Bearer header เพื่อให้ cron endpoint ปฏิเสธคนอื่นที่รู้ URL ได้ Vercel Cron จะส่งให้อัตโนมัติเมื่อตั้ง environment variable ชื่อ CRON_SECRET ไว้
- Cron secret ควรยาวเท่าไร?
- 256 บิต หรือ hex 64 ตัว ก็เพียงพอ ยาวกว่านี้ได้ แต่แทบไม่เพิ่มความปลอดภัยในทางปฏิบัติสำหรับ cron job
- ควรเลือก Hex, Base64url หรือ A–Z 0–9?
- ทั้งสามแบบใช้ใน header และไฟล์ .env ได้อย่างปลอดภัย Hex ใช้กันแพร่หลายที่สุด Base64url สั้นกว่าที่ความแข็งแรงเท่ากัน ส่วน A–Z 0–9 เหมาะกับระบบที่ไม่รับสัญลักษณ์ เครื่องมือจะปรับความยาวให้ทุกแบบมีความแข็งแรงเท่ากัน
- ทำไม cron route บน Vercel ตอบ 401?
- ส่วนใหญ่เพราะยังไม่ได้ตั้งตัวแปรใน environment Production ยังไม่ได้ redeploy หลังเพิ่มตัวแปร หรือชื่อตัวแปรในโค้ดไม่ตรงกัน ลองทดสอบเองด้วยคำสั่ง curl จากเครื่องมือเพื่อดูว่าผิดที่ฝั่งไหน
- ใช้รหัสผ่านแบบสุ่มแทนได้ไหม?
- ได้ แต่ secret ที่สร้างจากเครื่องมือนี้ดีกว่า เพราะยาว สุ่มจริง และใช้แต่ตัวอักษรที่ปลอดภัยสำหรับ header ส่วนรหัสผ่านสำหรับคน ใช้ ตัวสร้างรหัสผ่าน แทน
คู่มืออื่นๆ
- วิธีจัดรูปแบบ JSON ตรวจสอบและแก้ JSON ที่ผิดจัดรูปแบบ JSON ให้อ่านง่ายทันที บอกบรรทัดและคอลัมน์ที่ผิดพลาดแบบเจาะจง พร้อมวิธีแก้ข้อผิดพลาดที่เจอบ่อย JSON Formatter ฟรีที่ทำงานในเบราว์เซอร์ อ่าน 7 นาที
- วิธีรวมไฟล์ PDF หลายไฟล์เป็นไฟล์เดียว (ฟรี ไม่ต้องอัปโหลด)รวม PDF หลายไฟล์เป็นไฟล์เดียวในไม่ถึงนาที ใช้ได้ทั้ง Windows, Mac, iPhone และ Android ฟรี ไม่ต้องสมัคร และไฟล์ไม่ออกจากเครื่องของคุณ อ่าน 5 นาที
- วิธีลดขนาดไฟล์ PDF ให้เล็กลง ส่งอีเมลได้ (ฟรี)ลดขนาดไฟล์ PDF ให้เล็กพอส่งอีเมลหรือแชตได้ในไม่กี่วินาที เลือกระดับการบีบอัด เทียบขนาดก่อน-หลัง แล้วดาวน์โหลด ฟรี ไม่ต้องสมัคร ไม่มีการอัปโหลด อ่าน 7 นาที

