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

💬 สรุปสั้น ๆ
ทีม 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 เช่น การเปิดหรือปิดสิทธิ์เข้าถึงตำแหน่งผู้ใช้
บทความที่เกี่ยวข้อง (Related Articles)
ดูบทความอื่นในหมวด Website Securityรวมคู่มือและเช็กลิสต์ที่เกี่ยวข้องกับหัวข้อนี้ใน Trusty Knowledge Centerอ่านต่อในหัวข้อเดียวกัน

อัปเดต HTTP Security Headers ปี 2026: สิ่งที่ธุรกิจ SaaS สตาร์ทอัพ และบริษัทเทคโนโลยีต้องทบทวน
แนวทางทบทวน HSTS, X-Content-Type-Options, X-Frame-Options, Referrer-Policy และ Permissions-Policy สำหรับทีมวิศวกรรม SaaS ระดับ Implementation

วิธี Audit HTTP Security Headers ของ SaaS พร้อม Evidence ที่ควรเก็บ
ก่อนจะบอกได้ว่า HTTP Security Headers ของ SaaS พร้อมหรือยัง ต้องตรวจของจริงก่อน บทความนี้เดินผ่านขั้นตอน Audit ตั้งแต่ตรวจด้วย curl ไปจนถึงเก็บ Evidence รายงานทีม Privacy
เนื้อหานี้จัดทำขึ้นเพื่อให้ข้อมูลทั่วไปเท่านั้น ไม่ถือเป็นคำแนะนำทางกฎหมาย กรุณาปรึกษาผู้เชี่ยวชาญด้านกฎหมายหรือ Data Protection Officer ของหน่วยงานท่านก่อนนำไปปฏิบัติจริง
พร้อมตรวจสอบความน่าเชื่อถือของเว็บไซต์คุณหรือยัง?
ทดลองใช้งาน trusty ฟรี ไม่ต้องใช้บัตรเครดิต เริ่มสแกนได้ทันที