trusty — Website Trust Platform
Website Security

วิธี Audit HTTP Security Headers ของ SaaS พร้อม Evidence ที่ควรเก็บ

ก่อนจะบอกได้ว่า HTTP Security Headers ของ SaaS พร้อมหรือยัง ต้องตรวจของจริงก่อน บทความนี้เดินผ่านขั้นตอน Audit ตั้งแต่ตรวจด้วย curl ไปจนถึงเก็บ Evidence รายงานทีม Privacy

📅 เผยแพร่ 10 สิงหาคม 2569อัปเดตล่าสุด 10 สิงหาคม 2569✍️ เขียนโดย trusty Editorial Team⏱ อ่าน 9 นาที
A close-up of CDs and disks on a desk, featuring hands in a tech environment.
ภาพโดย cottonbro studio จาก Pexels

💬 สรุปสั้น ๆ

การ Audit HTTP Security Headers ของ SaaS เริ่มจากตรวจ Response Header จริงด้วย curl -I หรือ DevTools ของเบราว์เซอร์ทุก Subdomain แล้วเทียบกับค่าที่ควรมี บันทึกผลเป็น Evidence พร้อมวันที่ตรวจ และจัดลำดับ Priority การแก้ไขตามความเสี่ยงต่อ Embed และข้อมูลผู้ใช้

ทีม Engineering ที่ถูกถามว่า "เว็บเรามี Security Headers ครบไหม" ส่วนใหญ่ตอบจากความจำ ไม่ใช่จากการตรวจจริง คำตอบแบบนั้นใช้รายงานให้ทีม Privacy หรือผู้บริหารไม่ได้ เพราะไม่มี Evidence รองรับ การ Audit ที่ใช้งานได้จริงต้องเริ่มจากการดึงค่า Header ที่เซิร์ฟเวอร์ตอบกลับจริงในขณะนั้น บันทึกไว้เป็นหลักฐาน แล้วค่อยวิเคราะห์ว่าขาดอะไรและควรแก้อะไรก่อน

ตรวจสอบ Header ปัจจุบันด้วย curl และ DevTools

วิธีที่เร็วและไม่ต้องพึ่งเครื่องมือภายนอกคือใช้ curl -I https://app.example.com เพื่อดู Response Header ทั้งหมดที่เซิร์ฟเวอร์ส่งกลับมาจริง คำสั่งนี้ควรรันกับทุกโดเมนและ Subdomain ที่ SaaS มี ไม่ใช่แค่โดเมนหลัก เพราะ Marketing Site, Docs, Status Page หรือ API Gateway มักตั้งค่า Header ต่างจากแอปหลักโดยไม่มีใครสังเกต

สำหรับหน้าที่ต้องดูพฤติกรรมจริงของเบราว์เซอร์ เช่น Iframe ที่ถูกบล็อกหรือฟีเจอร์ที่ขอสิทธิ์กล้องไม่ได้ ควรเปิด DevTools แท็บ Network แล้วดู Response Headers ของ Request หลักของหน้านั้น พร้อมดูแท็บ Console ว่ามี Error ที่เกี่ยวข้องกับ Content-Security-Policy, X-Frame-Options หรือ Permissions-Policy หรือไม่ วิธีนี้ช่วยให้เห็นผลกระทบจริงต่อผู้ใช้ ไม่ใช่แค่เห็นว่า Header มีอยู่ในรายการ

ตรวจแบบ Automated เพื่อให้ทำซ้ำได้

ทีมที่ต้อง Audit หลาย Subdomain ซ้ำ ๆ ควรเขียน Script สั้น ๆ ที่วน curl ผ่านรายชื่อโดเมนทั้งหมดแล้วบันทึกผลลง CSV หรือ Log แทนการรันทีละคำสั่งด้วยมือ วิธีนี้ทำให้ Audit รอบถัดไปเปรียบเทียบกับผลรอบก่อนได้ทันที และลดโอกาสที่จะลืมตรวจ Subdomain ใดไป

ตรวจผ่าน CDN หรือ Edge Node หลายจุด

SaaS ที่ใช้ CDN กระจายอยู่หลายภูมิภาคควรตรวจ Header จากมากกว่าหนึ่ง Edge Node เพราะบางครั้ง Config ที่ตั้งไว้ที่ Origin Server ไม่ได้ถูกส่งต่อไปยังทุก Edge Node ให้ครบ โดยเฉพาะช่วงที่เพิ่ง Deploy Config ใหม่และ Cache ของ CDN ยังไม่อัปเดตทั่วถึง การตรวจจากภูมิภาคเดียวแล้วสรุปว่า Header ครบทุกจุดจึงเป็นข้อสรุปที่เร็วเกินไป

อ่านผลตรวจ Header ทีละตัวหมายความว่าอย่างไร

เมื่อได้ผลตรวจมาแล้ว ขั้นตอนถัดไปคืออ่านผลให้ถูกต้อง เพราะการที่ Header "มีอยู่" ไม่ได้แปลว่า "ตั้งค่าเหมาะสม" เสมอไป

ผลที่พบความหมายสิ่งที่ต้องตรวจเพิ่ม
ไม่มี Strict-Transport-Security เลยเบราว์เซอร์ยังยอมเชื่อมต่อผ่าน HTTP ได้ในบางกรณีตรวจว่าทุก Subdomain รองรับ HTTPS ครบก่อนเพิ่ม Header นี้
มี HSTS แต่ max-age สั้นมากการป้องกันมีผลแค่ช่วงเวลาสั้น ๆ หลังผู้ใช้เข้าเว็บครั้งล่าสุดประเมินว่าพร้อมขยาย max-age ตามความมั่นใจใน Subdomain ทั้งหมดหรือยัง
ไม่มี X-Content-Type-Optionsเบราว์เซอร์อาจเดา MIME Type เองตรวจว่ามีจุดใดในระบบที่ผู้ใช้อัปโหลดไฟล์แล้วระบบเสิร์ฟไฟล์นั้นกลับหรือไม่
X-Frame-Options เป็น DENYไม่มีเว็บใดฝัง Iframe ของแอปได้เลยตรวจว่าตรงกับที่ผลิตภัณฑ์ต้องการจริงหรือไม่ ถ้ามี Embed Dashboard ให้ลูกค้า ค่านี้อาจเข้มเกินไป
ไม่มี Referrer-Policyเบราว์เซอร์ใช้ค่าเริ่มต้นซึ่งอาจส่ง URL แบบเต็มออกนอกโดเมนตรวจ URL Pattern ของระบบว่ามีพารามิเตอร์ที่ไม่ควรรั่วไปนอกโดเมนหรือไม่
ไม่มี Permissions-Policyทุก Iframe ที่ฝังอยู่ในหน้าอาจขอสิทธิ์ Browser Feature ได้อย่างเปิดกว้างตรวจว่าหน้าใดฝัง Third-party Script ที่ไม่จำเป็นต้องใช้กล้องหรือตำแหน่งผู้ใช้

ผลตรวจแบบ "มี" หรือ "ไม่มี" อย่างเดียวไม่พอสำหรับรายงาน Audit ที่ใช้งานได้จริง ต้องระบุค่าที่พบจริงประกอบด้วยเสมอ เช่น ระบุ max-age ที่พบจริง หรือระบุค่า Referrer-Policy ที่พบจริง เพราะทีมที่มารับช่วงแก้ไขต่อจะได้ไม่ต้องไปตรวจซ้ำ นอกจากนี้ X-Frame-Options และ frame-ancestors ควรอ่านผลคู่กันเสมอ เพราะบางระบบตั้งค่าไว้ทั้งสองตัวพร้อมกันเพื่อรองรับเบราว์เซอร์รุ่นเก่าที่ยังไม่รู้จัก frame-ancestors หากพบว่ามีแค่ X-Frame-Options แต่ไม่มี frame-ancestors ใน Content-Security-Policy ควรตรวจว่าเป็นการตั้งใจไว้เฉพาะกรณีที่ไม่ต้องระบุหลายโดเมน หรือเป็นเพียงการตั้งค่าที่ยังไม่ครบ

เก็บ Evidence สำหรับรายงานให้ทีม Privacy และผู้บริหาร

Evidence ของ Security Finding ที่ใช้งานได้จริงต้องมีองค์ประกอบครบ ไม่ใช่แค่บอกว่า Header ตัวไหนหาย แต่ต้องมี Impact และ Context ประกอบด้วย ตามหลักการที่ว่าห้ามใช้ Header ที่หายไปเพียงข้อเดียวสรุปว่าเว็บถูกแฮกหรือมีช่องโหว่ร้ายแรง

  • บันทึกวันที่และเวลาที่ตรวจ พร้อมคำสั่งหรือเครื่องมือที่ใช้ตรวจ เพื่อให้ทำซ้ำได้
  • บันทึกค่า Header จริงที่พบ ไม่ใช่แค่สรุปว่า "ผ่าน" หรือ "ไม่ผ่าน"
  • ระบุ Subdomain หรือ Service ที่ตรวจ เพราะผลอาจต่างกันในแต่ละจุด
  • อธิบาย Impact ที่เป็นไปได้อย่างสมเหตุสมผล เช่น "หากไม่มี Referrer-Policy อาจมีความเสี่ยงที่พารามิเตอร์ใน URL รั่วไปยังปลายทางภายนอก" แทนการฟันธงว่าเกิดความเสียหายแล้ว
  • ระบุ False-positive Possibility เช่น บาง Endpoint อาจตั้งใจไม่ใส่ Header บางตัวเพราะเป็น API ที่ไม่มีการ Render HTML
  • แนบภาพหน้าจอหรือ Log ผลตรวจไว้เป็นหลักฐานประกอบรายงาน

Evidence ชุดนี้ควรส่งต่อให้ทีม Privacy ตรวจสอบว่าตรงกับสิ่งที่ระบุไว้ใน Privacy Policy หรือไม่ โดยเฉพาะ Referrer-Policy และ Permissions-Policy ที่กระทบการไหลของข้อมูลผู้ใช้โดยตรง ไม่ใช่แค่เรื่องเทคนิคของทีม Engineering ฝ่ายเดียว การส่งรายงานที่มี Evidence ครบยังช่วยให้ผู้บริหารตัดสินใจจัดลำดับความสำคัญของการแก้ไขได้เร็วกว่าการฟังสรุปปากเปล่า

กรณี Header หายไปหลังเปลี่ยน Infra จะสืบสาเหตุอย่างไร

เหตุการณ์ที่พบบ่อยในการ Audit รอบถัดไปคือ Header ที่เคยมีอยู่ในรอบตรวจก่อนหน้ากลับหายไป ซึ่งมักเกิดจากการเปลี่ยน CDN เปลี่ยน Reverse Proxy หรือมีการ Deploy Config ใหม่ที่ทับค่าเดิมโดยไม่ตั้งใจ

ขั้นตอนสืบสาเหตุที่ทำได้จริงคือเทียบผล Audit รอบปัจจุบันกับรอบก่อนหน้าทีละ Subdomain แล้วดูว่า Header ใดหายไปตรงกับช่วงเวลาที่มีการเปลี่ยนแปลง Infra ครั้งล่าสุดหรือไม่ หากทีมมี Change Log หรือ Deploy History ควรนำมาเทียบเวลาโดยตรง เพื่อระบุ Commit หรือการเปลี่ยนแปลงที่เป็นสาเหตุ แทนการเดาว่าอาจเกิดจากอะไรก็ได้

เมื่อระบุสาเหตุได้แล้ว ควรเพิ่ม Automated Test ที่ตรวจ Header ตัวนั้นเข้าไปใน CI ทันที เพื่อไม่ให้เหตุการณ์เดิมเกิดซ้ำในการเปลี่ยน Infra ครั้งถัดไป การ Audit ที่ดีไม่ควรจบแค่แก้ปัญหาเฉพาะหน้า แต่ต้องปิดช่องว่างที่ทำให้ปัญหาเกิดซ้ำได้ด้วย

วางแผนแก้ไขตาม Priority

ผล Audit มักพบหลายจุดพร้อมกัน การแก้ทุกจุดพร้อมกันไม่ใช่แนวทางที่ปลอดภัยเสมอไป ควรจัดลำดับตามความเสี่ยงและผลกระทบต่อผลิตภัณฑ์

  • ลำดับแรก: Header ที่กระทบข้อมูลผู้ใช้โดยตรงและแก้ง่าย เช่น X-Content-Type-Options ที่แทบไม่กระทบฟีเจอร์ใด
  • ลำดับถัดมา: Header ที่กระทบ Embed หรือ Third-party Script ซึ่งต้องทดสอบก่อน เช่น frame-ancestors และ Permissions-Policy
  • ลำดับสุดท้าย: Header ที่กระทบวงกว้างถ้าตั้งผิด เช่น Strict-Transport-Security ที่ควรขยาย max-age แบบค่อยเป็นค่อยไป

แผนแก้ไขควรระบุผู้รับผิดชอบและกำหนดเวลาที่ชัดเจนสำหรับแต่ละจุด พร้อมวันที่จะ Audit ซ้ำเพื่อยืนยันว่าการแก้ไขได้ผลจริง การ Audit ที่ไม่มีรอบตรวจซ้ำจะทำให้ไม่มีใครรู้ว่าปัญหาที่พบไปครั้งก่อนได้รับการแก้ไขจริงหรือไม่

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

Audit HTTP Security Headers ควรทำบ่อยแค่ไหน ทีมส่วนใหญ่ตรวจทุกครั้งที่มีการเปลี่ยน Infra สำคัญ เช่น เปลี่ยน CDN หรือ Reverse Proxy และตรวจตามรอบอย่างน้อยทุกไตรมาสเพื่อจับความเปลี่ยนแปลงที่ไม่มีใครแจ้ง

ใช้เครื่องมือตรวจ Header ออนไลน์แทน curl ได้ไหม ใช้ได้เป็นจุดเริ่มต้น แต่ควรตรวจซ้ำด้วย curl หรือ DevTools ของทีมเองด้วย เพราะเครื่องมือภายนอกบางตัวไม่เห็น Header ที่ขึ้นกับ Session หรือ Path เฉพาะของแอป

ถ้า Endpoint บาง Path ไม่มี Header เลยถือว่าผิดปกติหรือไม่ ไม่เสมอไป บาง API Endpoint ที่ตอบกลับเป็น JSON ล้วนอาจไม่จำเป็นต้องมี Header บางตัวเหมือนหน้า HTML เต็มรูปแบบ ควรตรวจ Context ของ Endpoint นั้นก่อนสรุปว่าเป็นปัญหา

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

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

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

สร้าง Automated Test ผูก Header เข้ากับ CI/CD ให้ตรวจซ้ำได้เอง

ทีม Engineering ที่ Audit ด้วยมือทุกไตรมาสเพียงอย่างเดียวยังมีช่องว่างระหว่างรอบตรวจที่ Header อาจหายไปโดยไม่มีใครรู้ทันที วิธีปิดช่องว่างนี้คือเขียน Test สั้น ๆ ที่ยิง Request ไปยัง Endpoint สำคัญแล้วตรวจว่า Header ที่คาดหวังยังอยู่ครบ ผูก Test นี้เข้ากับ Pipeline CI/CD ให้รันทุกครั้งที่ Deploy หรือรันเป็น Cron Job แยกต่างหากทุกวัน เพื่อให้ทีมได้รับแจ้งเตือนทันทีที่ Header หายไป แทนที่จะรอถึงรอบ Audit ไตรมาสถัดไปถึงจะรู้

Test แบบนี้ไม่จำเป็นต้องซับซ้อน เพียงตรวจว่า Header แต่ละตัวมีอยู่จริงและมีค่าที่ไม่ต่ำกว่ามาตรฐานขั้นต่ำที่ทีมกำหนดไว้ก็เพียงพอสำหรับจุดประสงค์นี้ ไม่จำเป็นต้องตรวจ Logic ที่ซับซ้อนเหมือน Test ฟีเจอร์อื่นของผลิตภัณฑ์ สิ่งสำคัญคือให้ Test ครอบคลุม Subdomain หลักทั้งหมดที่เคย Audit ด้วยมือไว้ก่อนหน้านี้ ไม่ใช่แค่โดเมนแอปหลักเพียงจุดเดียว เพราะ Marketing Site หรือ Docs ที่แยก Deploy กันมักถูกลืมเวลาสร้าง Automated Test

สื่อสารผลตรวจให้ทีม Product และฝ่ายขายเข้าใจได้ด้วย

รายงาน Audit ที่มีแต่ศัพท์เทคนิคของ Header มักถูกอ่านแค่ในทีม Engineering เท่านั้น ทั้งที่ SaaS หลายรายต้องตอบคำถามด้าน Security จากลูกค้าองค์กรผ่านทีมขายหรือทีม Customer Success เป็นประจำ การสรุปผล Audit เป็นภาษาที่ไม่ใช่ศัพท์เทคนิคล้วน เช่น ระบุว่า Endpoint ใดผ่านมาตรฐานแล้วกี่เปอร์เซ็นต์ และมีแผนแก้ไขจุดที่เหลืออย่างไร ช่วยให้ทีมขายตอบคำถามลูกค้าองค์กรได้เร็วขึ้นโดยไม่ต้องรอทีม Engineering ทุกครั้ง

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

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

  • รัน curl -I หรือเปิด DevTools ตรวจ Response Header ของทุก Subdomain และ Service
  • บันทึกค่า Header จริงที่พบพร้อมวันที่ตรวจไว้เป็น Evidence
  • เทียบผลตรวจรอบปัจจุบันกับรอบก่อนหน้าเพื่อจับ Header ที่หายไป
  • อธิบาย Impact และ False-positive Possibility ของแต่ละจุดที่พบ ไม่ฟันธงเกินหลักฐาน
  • ส่ง Evidence ให้ทีม Privacy ตรวจ Referrer-Policy และ Permissions-Policy ว่าตรงกับ Privacy Policy
  • จัดลำดับ Priority การแก้ไขตามความเสี่ยงและผลกระทบต่อ Embed
  • กำหนดวันที่ Audit ซ้ำเพื่อยืนยันว่าการแก้ไขได้ผลจริง

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

  • สรุปสถานะ Header จากความจำแทนการตรวจ Response จริง
  • ตรวจแค่โดเมนหลัก ไม่ได้ตรวจ Subdomain อย่าง Docs หรือ Status Page
  • รายงานแค่ว่า "มี" หรือ "ไม่มี" โดยไม่บันทึกค่าจริงที่พบ
  • ฟันธงว่าช่องโหว่ร้ายแรงจาก Header หายไปเพียงข้อเดียว โดยไม่ประเมิน Context ประกอบ
  • แก้ Header ทุกจุดพร้อมกันโดยไม่จัดลำดับ Priority ทำให้ยากต่อการตรวจสอบว่าอะไรทำให้เกิดปัญหาใหม่

สรุป

การ Audit HTTP Security Headers ของ SaaS ที่ใช้งานได้จริงต้องเริ่มจากการตรวจ Response จริงด้วย curl หรือ DevTools ไม่ใช่ตอบจากความจำ บันทึกผลเป็น Evidence ที่มี Impact และ Context ประกอบ ส่งต่อให้ทีม Privacy ตรวจสอบจุดที่กระทบข้อมูลผู้ใช้ และจัดลำดับการแก้ไขตามความเสี่ยงพร้อมกำหนดวันตรวจซ้ำ ดูขั้นตอนตั้งค่าที่เกี่ยวข้องเพิ่มเติมที่ เช็กลิสต์ HTTP Security Headers สำหรับ SaaS และภาพรวมที่ ศูนย์ความรู้ Website Security

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

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

Audit HTTP Security Headers ควรทำบ่อยแค่ไหน

ทีมส่วนใหญ่ตรวจทุกครั้งที่มีการเปลี่ยน Infra สำคัญ เช่น เปลี่ยน CDN หรือ Reverse Proxy และตรวจตามรอบอย่างน้อยทุกไตรมาสเพื่อจับความเปลี่ยนแปลงที่ไม่มีใครแจ้ง

ใช้เครื่องมือตรวจ Header ออนไลน์แทน curl ได้ไหม

ใช้ได้เป็นจุดเริ่มต้น แต่ควรตรวจซ้ำด้วย curl หรือ DevTools ของทีมเองด้วย เพราะเครื่องมือภายนอกบางตัวไม่เห็น Header ที่ขึ้นกับ Session หรือ Path เฉพาะของแอป

ถ้า Endpoint บาง Path ไม่มี Header เลยถือว่าผิดปกติหรือไม่

ไม่เสมอไป บาง API Endpoint ที่ตอบกลับเป็น JSON ล้วนอาจไม่จำเป็นต้องมี Header บางตัวเหมือนหน้า HTML เต็มรูปแบบ ควรตรวจ Context ของ Endpoint นั้นก่อนสรุปว่าเป็นปัญหา

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

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

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