trusty — Website Trust Platform
Website Security

วิธีวางระบบ HTTP Security Headers สำหรับทีม SaaS แบบเป็นขั้นตอน

ทีม Engineering ของ SaaS จะเริ่มตั้งค่า HSTS, X-Content-Type-Options, X-Frame-Options, Referrer-Policy และ Permissions-Policy อย่างไรให้ปลอดภัยและไม่พังของเดิม พร้อมขั้นตอนทดสอบก่อนขึ้นโปรดักชัน

📅 เผยแพร่ 10 สิงหาคม 2569อัปเดตล่าสุด 10 สิงหาคม 2569✍️ เขียนโดย trusty Editorial Team⏱ อ่าน 9 นาที
View of a computer monitor displaying green digital security code in an indoor setting.
ภาพโดย Tima Miroshnichenko จาก Pexels

💬 สรุปสั้น ๆ

ทีม SaaS ควรตั้งค่าเฮดเดอร์ทั้งห้าตัวที่ Reverse Proxy หรือ Edge Layer เดียวกัน ทดสอบด้วย curl -I และเครื่องมือตรวจเฮดเดอร์บน Staging ก่อน แล้วค่อยปล่อยขึ้น Production ทีละบริการพร้อมประสานกับทีม Privacy เรื่อง Referrer-Policy และ Permissions-Policy

ทีม Engineering ของ SaaS ส่วนใหญ่ตั้งค่า Content-Security-Policy ไว้แล้ว แต่ยังเหลือเฮดเดอร์อีกชุดหนึ่งที่มักถูกมองข้าม ได้แก่ Strict-Transport-Security, X-Content-Type-Options, X-Frame-Options หรือ frame-ancestors, Referrer-Policy และ Permissions-Policy ทั้งห้าตัวนี้ทำงานคนละหน้าที่กัน ตั้งค่าไม่ยาก แต่ถ้าใส่ผิด Syntax หรือใส่ผิดจุด อาจทำให้ Embed ของลูกค้าองค์กรพังหรือ Third-party Widget โหลดไม่ขึ้น บทความนี้จึงเรียงลำดับขั้นตอนที่ทีมโปรดักต์และวิศวกรรมทำได้จริง ตั้งแต่ตั้งค่า ทดสอบใน CI/Staging จนถึงปล่อยขึ้น Production

เฮดเดอร์ที่ต้องตั้งค่าและหน้าที่ของแต่ละตัว

ก่อนลงมือเขียน Config ทีมควรเข้าใจว่าเฮดเดอร์แต่ละตัวป้องกันอะไร เพราะจะช่วยตัดสินใจเรื่องค่าที่เหมาะกับสถาปัตยกรรมของแอปได้ตรงจุดกว่า

Strict-Transport-Security (HSTS)

บังคับให้เบราว์เซอร์เชื่อมต่อผ่าน HTTPS เท่านั้นในช่วงเวลาที่กำหนด ตัวอย่างค่าเริ่มต้นที่ปลอดภัยสำหรับ SaaS ที่ทุก Subdomain รองรับ HTTPS แล้วคือ Strict-Transport-Security: max-age=31536000; includeSubDomains ทีมที่ยังไม่มั่นใจว่าทุก Subdomain (เช่น Docs, Status Page, Marketing Site) รองรับ HTTPS ครบ ควรเริ่มด้วยค่า max-age สั้นก่อน เช่น 300 วินาที แล้วค่อยขยับขึ้นเมื่อยืนยันว่าไม่มี Subdomain ใดหลุด HTTP

X-Content-Type-Options

มีค่าเดียวคือ X-Content-Type-Options: nosniff ป้องกันเบราว์เซอร์เดา MIME Type ของไฟล์เอง ซึ่งเป็นช่องทางหนึ่งที่ไฟล์ที่ควรเป็น Text กลับถูกตีความเป็น Script ได้ ตั้งค่านี้แทบไม่มีผลกระทบด้านหน้าตาแอปเลย จึงควรเปิดใช้เป็นค่าเริ่มต้นในทุกบริการ

X-Frame-Options และ frame-ancestors

ป้องกันไม่ให้เว็บอื่นฝัง iframe ของแอปไปวางซ้อนหลอกผู้ใช้ (Clickjacking) SaaS ที่ไม่มีฟีเจอร์ให้ลูกค้า Embed หน้าแอปในเว็บของตัวเอง ตั้งค่าง่ายที่สุดคือ X-Frame-Options: DENY ส่วน SaaS ที่ขาย Widget หรือ Embed Dashboard ให้ลูกค้า ต้องใช้ CSP directive frame-ancestors แทน เพราะระบุโดเมนที่อนุญาตได้ละเอียดกว่า เช่น Content-Security-Policy: frame-ancestors https://*.customer-domain.com และควรคง X-Frame-Options ไว้เป็น Fallback สำหรับเบราว์เซอร์รุ่นเก่าที่ยังไม่รู้จัก frame-ancestors

Referrer-Policy

กำหนดว่าจะส่งข้อมูล URL ต้นทางไปให้เว็บปลายทางมากแค่ไหนเวลาผู้ใช้คลิกลิงก์ออกจากแอป ค่าที่สมดุลระหว่างความเป็นส่วนตัวกับความต้องการของทีม Growth ที่ยังอยากเห็น Referrer ภายในโดเมนตัวเองคือ Referrer-Policy: strict-origin-when-cross-origin ซึ่งส่ง Path เต็มเมื่อไปปลายทาง HTTPS โดเมนเดียวกัน แต่ตัด Path เหลือแค่โดเมนต้นทางเมื่อข้ามไปโดเมนอื่น

Permissions-Policy

จำกัดว่า Browser Feature ใดบ้าง (กล้อง ไมโครโฟน Geolocation Payment) ที่หน้าเว็บหรือ iframe ที่ฝังอยู่เรียกใช้ได้ ตัวอย่างสำหรับ SaaS ที่ไม่ได้ใช้ฟีเจอร์เหล่านี้เลยคือ Permissions-Policy: camera=(), microphone=(), geolocation=() ส่วนแอปที่มีฟีเจอร์ Video Call หรือแนบไฟล์จากกล้อง ต้องระบุโดเมนที่อนุญาตแทนการปิดทั้งหมด

ขั้นตอนตั้งค่าและทดสอบใน CI/Staging ก่อนขึ้นโปรดักชัน

ทีม Engineering ที่วางเฮดเดอร์เหล่านี้ที่ Reverse Proxy หรือ Edge Layer (เช่น Nginx, Cloudflare Workers, หรือ Middleware ของเฟรมเวิร์ก) ควรทำตามลำดับนี้เพื่อลดความเสี่ยงที่ระบบจริงจะพัง

ขั้นที่ 1 เขียน Config รวมจุดเดียว

รวมเฮดเดอร์ทั้งหมดไว้ที่ชั้นเดียว เช่น Middleware กลางหรือ Edge Config แทนการกระจายไปตั้งค่าในแต่ละ Service เพราะถ้าต้องแก้ค่าในอนาคต (เช่นเพิ่มโดเมนใน frame-ancestors) จะได้แก้จุดเดียว

ขั้นที่ 2 เพิ่ม Automated Test ใน CI

เขียน Integration Test ที่ยิง Request ไปที่ Staging แล้วตรวจว่าเฮดเดอร์ที่คาดหวังมาครบและมีค่าตรงตามที่ตั้งไว้ วิธีนี้ป้องกันไม่ให้การ Deploy ครั้งถัดไปลบเฮดเดอร์ออกไปโดยไม่ตั้งใจ ซึ่งเป็นบั๊กที่เกิดบ่อยเวลาทีมย้าย Infra หรือเปลี่ยน Reverse Proxy

ขั้นที่ 3 ทดสอบบน Staging ด้วยของจริง

ใช้คำสั่ง curl -I https://staging.example.com เพื่อดูเฮดเดอร์ทั้งหมดที่ตอบกลับจริง แล้วเปิดหน้าแอปบน Staging ด้วยเบราว์เซอร์จริง ตรวจ Console ว่ามี Error จาก Embed, Iframe หรือ Third-party Script ที่โดน frame-ancestors หรือ Permissions-Policy บล็อกหรือไม่ ขั้นนี้สำคัญมากสำหรับ SaaS ที่มี Marketing Pixel, Live Chat Widget หรือ Payment Iframe ฝังอยู่

ขั้นที่ 4 ทยอยปล่อยขึ้น Production ทีละบริการ

สำหรับสถาปัตยกรรมแบบ Microservice หรือหลาย Subdomain ควรเริ่มจากบริการที่มีความเสี่ยงต่ำสุด เช่น Marketing Site ก่อน แล้วค่อยขยับไปที่ App หลักและ API Gateway เมื่อมั่นใจว่าไม่มีผลกระทบ HSTS โดยเฉพาะควรขยาย max-age ทีละขั้น ไม่ใช่กระโดดไปที่ค่าปีเต็มตั้งแต่รอบแรก เพราะถ้ามี Subdomain ใดยังไม่รองรับ HTTPS ผู้ใช้จะเข้าเว็บนั้นไม่ได้เลยจนกว่า max-age จะหมดอายุ

ประสานงานกับทีม Privacy เรื่อง Referrer-Policy และ Permissions-Policy

Referrer-Policy และ Permissions-Policy เป็นสองเฮดเดอร์ที่เกี่ยวข้องกับทีม Privacy โดยตรง เพราะกระทบการไหลของข้อมูลผู้ใช้ ไม่ใช่แค่เรื่องความปลอดภัยของโค้ด

ก่อนเปลี่ยนค่า Referrer-Policy ทีม Engineering ควรเช็คกับทีม Growth และ Privacy ว่า Attribution ของแคมเปญโฆษณาหรือ Analytics ตัวใดพึ่งพา Referrer แบบเต็ม Path หรือไม่ เพราะการเปลี่ยนไปใช้ค่าที่เข้มขึ้นอาจทำให้รายงานการตลาดขาดข้อมูลบางส่วนโดยไม่มีใครรู้จนกว่าจะเห็นตัวเลขตกลง ส่วน Permissions-Policy ที่ปิดการเข้าถึงกล้องหรือ Geolocation ทีม Privacy ควรตรวจสอบว่าตรงกับสิ่งที่ระบุไว้ใน Privacy Policy ของผลิตภัณฑ์หรือไม่ เช่น ถ้า Privacy Policy บอกว่าแอปไม่เก็บตำแหน่งผู้ใช้ แต่ Permissions-Policy ยังเปิด Geolocation ไว้กว้าง ก็ควรปิดให้ตรงกับสิ่งที่สื่อสารไว้จริง การประชุมสั้น ๆ ระหว่างทีม Engineering กับ Privacy ก่อนปรับค่าทั้งสองตัวนี้ ช่วยลดโอกาสที่จะต้องแก้ไขย้อนหลังหลังจากมีผู้ใช้ร้องเรียน ทีมที่ทำงานร่วมกันแบบนี้ควรมีช่องทางบันทึกการเปลี่ยนแปลงเฮดเดอร์แต่ละครั้งไว้ เช่น Pull Request ที่ระบุเหตุผลของการเปลี่ยนค่า เพื่อให้ทีม Privacy ย้อนดูได้ภายหลังว่าเฮดเดอร์ชุดปัจจุบันสอดคล้องกับ Privacy Policy เวอร์ชันล่าสุดหรือไม่ โดยเฉพาะเมื่อ SaaS เพิ่ม Third-party Vendor รายใหม่เข้ามาในผลิตภัณฑ์ ซึ่งอาจต้องขยายรายการโดเมนใน Permissions-Policy หรือ frame-ancestors เพิ่มเติม

ข้อควรพิจารณาสำหรับสถาปัตยกรรมหลาย Subdomain และ Multi-tenant

SaaS จำนวนมากมี Subdomain แยกตามลูกค้าแบบ Multi-tenant เช่น customer1.example.com หรือมี Subdomain แยกตามบริการ เช่น api.example.com, app.example.com, docs.example.com การตั้งค่าเฮดเดอร์ที่ Edge Layer เดียวสำหรับทุก Subdomain อาจไม่เหมาะสมเสมอไป เพราะ api.example.com ที่ตอบกลับเป็น JSON ล้วนไม่จำเป็นต้องมี frame-ancestors ที่ซับซ้อนเท่า app.example.com ที่เป็นหน้าเว็บเต็มรูปแบบ ทีม Engineering จึงควรแยก Config เฮดเดอร์ตามลักษณะ Response ของแต่ละ Subdomain แทนการใช้ชุดเดียวกันทั้งหมด และเมื่อเพิ่ม Subdomain ใหม่เข้าระบบ ต้องเพิ่มเข้าไปใน Automated Test ของ CI ด้วยทุกครั้ง ไม่ใช่แค่จำไว้ว่าต้องตั้งค่าด้วยมือ เพราะ Subdomain ใหม่ที่ลืมตั้งเฮดเดอร์เป็นจุดที่ทำให้ผลตรวจความปลอดภัยโดยรวมของโดเมนตกลงได้ง่ายที่สุด

มอนิเตอร์เฮดเดอร์หลัง Deploy ไม่ใช่แค่ตั้งครั้งเดียวแล้วจบ

หลังจากปล่อยเฮดเดอร์ทั้งห้าตัวขึ้น Production แล้ว งานยังไม่จบแค่นั้น เพราะทุกครั้งที่ทีมเปลี่ยน Infra เช่น ย้าย CDN, เปลี่ยน Reverse Proxy, หรือเพิ่ม API Gateway ตัวใหม่ มีความเสี่ยงที่เฮดเดอร์บางตัวจะหายไปโดยไม่มีใครสังเกต ทีม Engineering ควรผูก Automated Test ที่ตรวจเฮดเดอร์เข้ากับ Pipeline การ Deploy จริง ไม่ใช่แค่รันครั้งเดียวตอนเขียน Config เสร็จ เพื่อให้การเปลี่ยนแปลง Infra ในอนาคตไม่ทำให้เฮดเดอร์ที่ตั้งไว้หายไปเงียบ ๆ

อีกจุดที่ควรมอนิเตอร์คือรายงาน Growth และ Analytics หลังเปลี่ยน Referrer-Policy ควรตรวจดูตัวเลข Attribution ในสัปดาห์แรกหลัง Deploy เทียบกับสัปดาห์ก่อนหน้า ถ้าตัวเลขจาก Referral Traffic ตกลงผิดปกติ อาจเป็นสัญญาณว่าค่าที่ตั้งเข้มเกินไปสำหรับ Use Case ของทีม Growth และควรกลับมาคุยกันใหม่ว่าจะปรับค่าหรือเปลี่ยนวิธีวัดผลแทน สำหรับ Permissions-Policy ทีมควรตรวจ Error Log ของฝั่ง Frontend เป็นระยะว่ามี Feature ใดถูกบล็อกโดยไม่ตั้งใจหลังเพิ่มฟีเจอร์ใหม่ที่ต้องใช้กล้องหรือไมโครโฟน เพราะเฮดเดอร์นี้จะปิดกั้นเงียบ ๆ โดยไม่มี Error แจ้งผู้ใช้ที่ชัดเจนเสมอไป การมอนิเตอร์แบบนี้ทำให้ทีมจับปัญหาได้เร็วกว่าการรอให้ลูกค้าแจ้งเข้ามาเอง

พร้อมตรวจสอบความน่าเชื่อถือของเว็บไซต์คุณหรือยัง?

ทดลองใช้งาน trusty ฟรี ไม่ต้องใช้บัตรเครดิต เริ่มสแกนได้ทันที

ทดลองใช้งานระบบฟรี

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

ตั้ง HTTP Security Headers ที่ Application Layer หรือ Edge/Reverse Proxy ดีกว่ากัน ส่วนใหญ่แนะนำให้ตั้งที่ Edge หรือ Reverse Proxy เพราะครอบคลุมทุก Response โดยไม่ต้องพึ่งพาโค้ดแอปแต่ละตัว และแก้ค่าได้เร็วกว่าการ Deploy โค้ดใหม่ทั้งระบบ

ต้องเปิด HSTS max-age เต็มปีตั้งแต่วันแรกไหม ไม่จำเป็น ทีมที่ยังไม่มั่นใจว่าทุก Subdomain รองรับ HTTPS ครบควรเริ่มด้วยค่าสั้นก่อน แล้วค่อยขยายเมื่อยืนยันแล้วว่าไม่มี Subdomain ใดหลุด HTTP

SaaS ที่ขาย Embed Widget ให้ลูกค้าควรใช้ X-Frame-Options หรือ frame-ancestors ควรใช้ frame-ancestors ใน Content-Security-Policy เพราะระบุโดเมนที่อนุญาตได้ละเอียดกว่า และคง X-Frame-Options ไว้เป็น Fallback สำหรับเบราว์เซอร์รุ่นเก่า

ทำไมทีม Privacy ต้องมีส่วนร่วมในการตั้งค่า Referrer-Policy และ Permissions-Policy เพราะสองเฮดเดอร์นี้กระทบการไหลของข้อมูลผู้ใช้และต้องสอดคล้องกับสิ่งที่ระบุไว้ใน Privacy Policy เช่น การเปิดหรือปิดสิทธิ์เข้าถึงตำแหน่งผู้ใช้

เช็กลิสต์ปฏิบัติ

  • ตั้งค่า Strict-Transport-Security พร้อม includeSubDomains หลังยืนยันว่าทุก Subdomain รองรับ HTTPS แล้ว
  • เปิด X-Content-Type-Options: nosniff เป็นค่าเริ่มต้นทุกบริการ
  • เลือกระหว่าง X-Frame-Options: DENY กับ frame-ancestors ตามว่าแอปต้องรองรับ Embed จากลูกค้าหรือไม่
  • ตั้ง Referrer-Policy หลังคุยกับทีม Growth เรื่อง Attribution
  • ตั้ง Permissions-Policy ให้ตรงกับสิ่งที่ระบุใน Privacy Policy
  • เพิ่ม Automated Test ใน CI ที่ตรวจเฮดเดอร์ทุกครั้งที่ Deploy
  • ทดสอบบน Staging ด้วยเบราว์เซอร์จริงก่อนปล่อย Production

ข้อผิดพลาดที่พบบ่อย

  • ตั้ง HSTS max-age เต็มปีตั้งแต่รอบแรกทั้งที่ยังมี Subdomain ที่ไม่รองรับ HTTPS
  • ใช้ X-Frame-Options: DENY กับแอปที่ต้องให้ลูกค้า Embed Dashboard จึงทำให้ฟีเจอร์นั้นใช้งานไม่ได้
  • เปลี่ยน Referrer-Policy โดยไม่แจ้งทีม Growth ทำให้รายงาน Attribution ผิดเพี้ยนโดยไม่รู้สาเหตุ
  • ตั้งเฮดเดอร์เฉพาะที่ Production แต่ไม่ตั้งที่ Staging ทำให้ไม่เจอปัญหา Embed พังจนกว่าจะขึ้นจริง
  • ไม่มี Automated Test จึงไม่รู้ว่ามีการ Deploy ครั้งหนึ่งลบเฮดเดอร์ออกไปโดยไม่ตั้งใจ

สรุป

การวางระบบ HTTP Security Headers สำหรับ SaaS ไม่ใช่แค่การเพิ่มบรรทัด Config แต่ต้องผ่านการทดสอบใน CI/Staging และการประสานงานกับทีม Privacy และ Growth ก่อนปล่อยขึ้น Production จริง เพราะเฮดเดอร์บางตัวกระทบทั้งฟีเจอร์ Embed และรายงานการตลาด การทยอยปล่อยทีละบริการพร้อมมี Test คอยตรวจซ้ำ ช่วยให้ทีมจับปัญหาได้ก่อนผู้ใช้จริงเจอ ดูเพิ่มเติมที่ ศูนย์ความรู้ Website Security และ แนวทาง HTTPS/TLS สำหรับเว็บไซต์ เพื่อวางรากฐานความปลอดภัยของ Transport Layer ควบคู่กันไป

แหล่งข้อมูลอ้างอิง

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

ตั้ง HTTP Security Headers ที่ Application Layer หรือ Edge/Reverse Proxy ดีกว่ากัน

ส่วนใหญ่แนะนำให้ตั้งที่ Edge หรือ Reverse Proxy เพราะครอบคลุมทุก Response โดยไม่ต้องพึ่งพาโค้ดแอปแต่ละตัว และแก้ค่าได้เร็วกว่าการ Deploy โค้ดใหม่ทั้งระบบ

ต้องเปิด HSTS max-age เต็มปีตั้งแต่วันแรกไหม

ไม่จำเป็น ทีมที่ยังไม่มั่นใจว่าทุก Subdomain รองรับ HTTPS ครบควรเริ่มด้วยค่าสั้นก่อน แล้วค่อยขยายเมื่อยืนยันแล้วว่าไม่มี Subdomain ใดหลุด HTTP

SaaS ที่ขาย Embed Widget ให้ลูกค้าควรใช้ X-Frame-Options หรือ frame-ancestors

ควรใช้ frame-ancestors ใน Content-Security-Policy เพราะระบุโดเมนที่อนุญาตได้ละเอียดกว่า และคง X-Frame-Options ไว้เป็น Fallback สำหรับเบราว์เซอร์รุ่นเก่า

ทำไมทีม Privacy ต้องมีส่วนร่วมในการตั้งค่า Referrer-Policy และ Permissions-Policy

เพราะสองเฮดเดอร์นี้กระทบการไหลของข้อมูลผู้ใช้และต้องสอดคล้องกับสิ่งที่ระบุไว้ใน Privacy Policy เช่น การเปิดหรือปิดสิทธิ์เข้าถึงตำแหน่งผู้ใช้

เนื้อหานี้จัดทำขึ้นเพื่อให้ข้อมูลทั่วไปเท่านั้น ไม่ถือเป็นคำแนะนำทางกฎหมาย กรุณาปรึกษาผู้เชี่ยวชาญด้านกฎหมายหรือ Data Protection Officer ของหน่วยงานท่านก่อนนำไปปฏิบัติจริง

พร้อมตรวจสอบความน่าเชื่อถือของเว็บไซต์คุณหรือยัง?

ทดลองใช้งาน trusty ฟรี ไม่ต้องใช้บัตรเครดิต เริ่มสแกนได้ทันที