Security
HSTS (HTTP Strict Transport Security) คืออะไร?
HSTS หรือ HTTP Strict Transport Security คือ Security Header ที่บอกเบราว์เซอร์ของผู้เยี่ยมชมให้ "จดจำเว็บไซต์นี้ไว้" และเข้าผ่าน HTTPS เท่านั้น ห้ามกลับมาใช้ HTTP อีก HSTS ทำงานผ่านการส่งส่วนหัว HTTP (HTTP Header) ชื่อ Strict-Transport-Security จากเซิร์ฟเวอร์ของคุณไปยังเบราว์เซอร์ เมื่อเบราว์เซอร์ได้รับ Header นี้ มันจะจดจำและบังคับให้การเชื่อมต่อทั้งหมดกับเว็บไซต์ของคุณผ่านทาง HTTPS เท่านั้น แม้ว่าผู้ใช้จะพยายามเข้าผ่าน HTTP ก็ตาม
ตัวอย่าง Header HSTS ที่เบราว์เซอร์จะได้รับ:
Strict-Transport-Security: max-age=31536000; includeSubDomains
ส่วนประกอบของ Header นี้:
- max-age — ระยะเวลา (วินาที) ที่เบราว์เซอร์จะจดจำและบังคับใช้ HTTPS สำหรับเว็บไซต์นี้ ค่า 31536000 วินาที หมายถึง 1 ปี
- includeSubDomains — บอกเบราว์เซอร์ให้ใช้ HTTPS กับ Subdomain ทั้งหมดด้วย เช่น blog.yourdomain.com, shop.yourdomain.com เป็นต้น
- preload — (optional) สัญญาว่าโดเมนของคุณอยากเข้าไปในรายการ Preload ของเบราว์เซอร์ ซึ่งมันจะจดจำเว็บไซต์นี้ว่าต้องใช้ HTTPS มาตั้งแต่ครั้งแรกที่โหลดเบราว์เซอร์
ทำไม HSTS จึงมีความสำคัญต่อความปลอดภัย?
เมื่อผู้ใช้เข้าเยี่ยมชมเว็บไซต์ของคุณเป็นครั้งแรก การร้องขอมักจะเป็น HTTP (ไม่เข้ารหัส) แล้วเซิร์ฟเวอร์จึงส่ง Redirect (30x) ให้กลับมาใช้ HTTPS แต่ในช่วงเวลาเล็ก ๆ ของการร้องขอ HTTP ครั้งแรกนี้ ผู้โจมตีอาจจะดักฟังและโจมตีแบบ SSL Stripping โดยพยายามข้ามการ Redirect เพื่อให้การเชื่อมต่อยังคงเป็น HTTP ไม่ได้เป็นการเข้ารหัส ผู้โจมตีจึงสามารถดูรหัสผ่าน ข้อมูลบัญชี หรือข้อมูลอื่น ๆ ที่ส่งผ่านการเชื่อมต่อนั้นได้
HSTS แก้ปัญหานี้ได้โดย:
- ปิดช่องโหว่ HTTP ครั้งแรก — สำหรับผู้เยี่ยมชมที่มาเป็นครั้งที่สองและต่อเนื่องจากนั้น เบราว์เซอร์จะเข้าถึง HTTPS โดยตรง ไม่มี HTTP Redirect ไม่มีโอกาสให้ผู้โจมตีดักจับ
- ป้องกัน Protocol Downgrade Attacks — ผู้โจมตีไม่สามารถบังคับให้เบราว์เซอร์ลงไปใช้ HTTP เฉพาะเพราะเบราว์เซอร์จดจำ HSTS Header แล้ว
- เพิ่มประสิทธิภาพ — ลบการ Redirect HTTP ออก หมายความว่า request ที่สองจะเร็วกว่าเดิมเพราะไม่ต้อง redirect
ข้อกำหนดเบื้องต้นก่อนเปิดใช้งาน HSTS
คำเตือนสำคัญ: ก่อนเปิดใช้งาน HSTS คุณต้องตรวจสอบให้แน่ใจว่า SSL Certificate ทำงานได้อย่างถูกต้องบนโดเมนของคุณทั้งหมด ถ้า HSTS ถูกเปิดใช้งานบนเว็บไซต์ที่ SSL ยังไม่เสถียร ผู้เยี่ยมชมอาจจะไม่เข้าถึงเว็บไซต์ได้เลยเป็นช่วงเวลาหนึ่ง ดังนั้น ก่อนเปิดใช้งาน HSTS ตรวจสอบประเด็นต่อไปนี้:
- SSL Certificate ทำงานสำหรับ Domain หลัก — ทดสอบเข้าเว็บไซต์ผ่าน HTTPS (https://yourdomain.com) และตรวจสอบว่าไม่มี Warning หรือ Error
- SSL Certificate ครอบคลุม Subdomain ทั้งหมด — ถ้าคุณจะใส่ includeSubDomains ในนั้น ต้องตรวจสอบให้แน่ใจว่า www, shop, blog, mail ฯลฯ ทั้งหมดก็สามารถเข้าผ่าน HTTPS ได้ถูกต้อง (สามารถใช้ Wildcard Certificate เช่น *.yourdomain.com หรือ Multi-Domain Certificate)
- ไม่มี Mixed Content Issues — ปรับแต่งเนื้อหา JavaScript, CSS, Images ให้ใช้ HTTPS ทั้งหมด ไม่มี HTTP Resources ชั่วคราว
- Redirect HTTP to HTTPS ทำงานถูกต้อง — ตรวจสอบว่า HTTP Redirect ชี้ไปยัง HTTPS ที่ถูกต้อง ไม่มีการ Redirect วนซ้ำหรือชี้ไปอื่น
วิธีเปิดใช้งาน HSTS ผ่าน cPanel
cPanel มีวิธีการจัดการ HSTS ทั้งแบบ GUI (ถ้า Hosting Provider รองรับ) และแบบ Manual ผ่าน .htaccess ซึ่งใช้งานได้ทั่วไป
วิธีที่ 1: ผ่าน cPanel GUI (ถ้ามี)
Hosting Provider บางแห่งติดตั้ง WHM/cPanel รุ่นใหม่ที่มี HSTS Management ในส่วนของ SSL/TLS Options ขั้นตอน:
- Login เข้า cPanel ที่ https://yourdomain.com:2083
- มองหาส่วน Domains หรือ SSL/TLS
- หากมี HSTS Settings หรือ Manage HSTS ให้คลิกที่นั่น
- เลือกโดเมนที่ต้องการเปิด HSTS
- ตั้งค่า max-age (เริ่มด้วยค่าต่ำสำหรับทดสอบ เช่น 300 วินาที หรือ 3600 วินาที)
- เลือก includeSubDomains ถ้า Subdomain ทั้งหมดมี SSL ที่ถูกต้อง
- คลิก Save หรือ Enable
หมายเหตุ: ไม่ทุก Hosting Provider ที่มี cPanel จะมี GUI สำหรับ HSTS ถ้าไม่มี ให้ใช้วิธีที่ 2 (Manual ผ่าน .htaccess) แทน
วิธีที่ 2: ตั้งค่า HSTS ผ่าน .htaccess (ใช้ได้ทั่วไปที่สุด)
วิธีนี้ทำให้ได้สำหรับ Hosting ทุกแห่ง เพราะใช้ Apache Header Module ซึ่งเป็นมาตรฐาน ขั้นตอน:
- เชื่อมต่อกับ Hosting ของคุณผ่าน FTP หรือ File Manager ใน cPanel
- เลื่อนเข้าไปในโฟลเดอร์ Root ของเว็บไซต์ (public_html)
- ค้นหาไฟล์ชื่อ .htaccess ถ้ามีอยู่แล้ว ให้ Edit เพิ่มบรรทัด ถ้าไม่มี ให้สร้างไฟล์ใหม่ชื่อ .htaccess
- เพิ่มบรรทัดต่อไปนี้:
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains" env=HTTPS
</IfModule>
อธิบายแต่ละส่วน:
- <IfModule mod_headers.c> — ตรวจสอบว่า Apache Module ชื่อ mod_headers ถูกติดตั้งแล้ว ถ้ามี จึงทำคำสั่งต่อไป ถ้าไม่มี จะข้ามไป ป้องกัน Error
- Header always set — บอก Apache ให้ส่ง Header นี้ในทุก Response ไม่ว่าจะเป็น 200, 301, 404 เป็นต้น
- Strict-Transport-Security — ชื่อ Header ที่ใช้สำหรับ HSTS
- max-age=31536000 — ระยะเวลา 1 ปี (31,536,000 วินาที = 365 วัน)
- includeSubDomains — บังคับ HTTPS สำหรับ Subdomain ทั้งหมด ถ้าต้องการเฉพาะ Domain หลัก ให้ลบส่วนนี้ออก
- env=HTTPS — ส่ง Header นี้เฉพาะเมื่อการเชื่อมต่อเป็น HTTPS เท่านั้น (ไม่ส่ง HTTP)
5. บันทึกไฟล์ .htaccess ทับไฟล์เก่า
การตั้งค่า HSTS แบบค่อยเป็นค่อยไป (Staging)
ถ้าเป็นครั้งแรกที่เปิด HSTS บนเว็บไซต์ของคุณ ห้ามใส่ max-age เป็น 1 ปีเลย ให้ทำตามขั้นตอน Staging ต่อไปนี้ เพื่อหลีกเลี่ยงปัญหาที่อาจเกิดขึ้น:
- สัปดาห์ที่ 1: ตั้ง max-age เป็น 300 วินาที (5 นาที) เพื่อทดสอบว่าการตั้งค่าใช้งานได้ปกติ
- สัปดาห์ที่ 2-3: เพิ่มเป็น 3600 วินาที (1 ชั่วโมง) และสังเกตการณ์ไม่มี Error ในบริการ
- สัปดาห์ที่ 4: เพิ่มเป็น 86400 วินาที (1 วัน)
- เดือนที่ 2: เพิ่มเป็น 604800 วินาที (1 สัปดาห์)
- เดือนที่ 3: เพิ่มเป็นค่าเต็มรูป 31536000 วินาที (1 ปี) ตามที่ต้องการเพื่อได้ความปลอดภัยสูงสุด
ดังนั้น ถ้าต้องการปล่อยเว็บไซต์ตั้งแต่วันนี้ สร้างไฟล์ .htaccess ดังนี้ก่อน:
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=300; includeSubDomains" env=HTTPS
</IfModule>
ติดตามการทำงาน 5 นาที หากไม่มี Error ให้เปลี่ยนเป็น 3600 วินาที และทำตามขั้นตอนการเพิ่มค่าค่อยเป็นค่อยไปจนถึง 31536000 วินาที
HSTS Preload List คืออะไร?
นอกจาก HSTS Header ที่เซิร์ฟเวอร์ส่งมาแล้ว ยังมีการ Preload HSTS ในตัวเบราว์เซอร์ด้วย Google, Mozilla, Microsoft และเบราว์เซอร์อื่น ๆ ได้สร้าง Preload List ของเว็บไซต์ที่ต้อง HTTPS เสมอ รายการนี้ถูกฝังในรหัสเบราว์เซอร์ มีความหมายว่าแม้ว่าเป็นครั้งแรกที่ผู้ใช้เยี่ยมชมเว็บไซต์ของคุณ เบราว์เซอร์ก็จะเข้าถึง HTTPS โดยตรง
การเข้า Preload List เป็นการผูกมัดระยะยาวที่ย้อนกลับได้ยาก (ผ่านกระบวนการสมัครบนไซต์ https://hstspreload.org/) เพราะ:
- ต้องสัญญาว่าจะรักษา HSTS เสมอ แม้จะเปลี่ยนเจ้าของหรือเปลี่ยนแปลงบริการก็ตาม
- การถูกลบออกจาก Preload List นั้นใช้เวลามากเนื่องจากอัปเดตตัวเบราว์เซอร์ (ปกติสัปดาห์ถึงเดือน)
สำหรับโครงการส่วนใหญ่ HSTS Header ที่เซิร์ฟเวอร์ส่งมาก็พอสำหรับการปกป้องความปลอดภัยแล้ว
ตรวจสอบว่า HSTS ทำงานถูกต้อง
หลังจากตั้งค่า HSTS ใน .htaccess หรือ cPanel แล้ว ให้ทดสอบด้วยคำสั่งต่อไปนี้:
# 1. ตรวจสอบ HSTS Header จาก HTTPS
curl -sI https://yourdomain.com | grep -i strict-transport-security
# 2. ดูรายละเอียด Response Header ทั้งหมด
curl -sI https://yourdomain.com
# 3. ทดสอบจาก HTTP (ควรเปลี่ยนเป็น HTTPS Redirect)
curl -sI http://yourdomain.com | head -1
# 4. ตรวจสอบ Redirect Location (ควรชี้ไปยัง HTTPS)
curl -sI -L http://yourdomain.com | grep -i location
# 5. ทดสอบจากเบราว์เซอร์ DevTools (F12) และดู Response Headers tab
curl -sI https://yourdomain.com ถ้าใช้ Windows ให้ลองใช้ PowerShell คำสั่ง Invoke-WebRequest -Uri "https://yourdomain.com" -Method Head | Select-Object -ExpandProperty Headers หรือใช้เครื่องมือออนไลน์ https://securityheaders.com ได้เลยแก้ปัญหาที่พบบ่อย
Error: "ERR_INVALID_HTTP_RESPONSE" เมื่อเข้าเว็บไซต์หลัง HSTS เปิด
เกิดเมื่อเบราว์เซอร์บังคับให้ใช้ HTTPS แต่เซิร์ฟเวอร์ของคุณทำให้เกิด Error หรือ Connection Refused ความเป็นไปได้:
- SSL Certificate ยังไม่ติดตั้ง — ตรวจสอบใน cPanel ว่า SSL Certificate ติดตั้งอยู่แล้ว ถ้ายังไม่มี ให้ติดตั้ง AutoSSL หรือ SSL Certificate ใหม่
- SSL Certificate ไม่ตรงกับโดเมน — ตรวจสอบว่า Certificate ครอบคลุมโดเมนที่คุณกำลังใช้งาน (ต้องตรงกับ CN หรือ Subject Alternative Names)
- Port 443 ถูกบล็อก — ลองติดต่อ Hosting Provider ว่า Firewall เปิด Port 443 (HTTPS) แล้วหรือยัง
วิธีแก้: หยุด HSTS ชั่วคราว (ลบบรรทัด HSTS ออกจาก .htaccess) แล้วแก้ปัญหา SSL ก่อน หากต้องการให้เบราว์เซอร์ลืม HSTS Max-age ที่เคยได้รับไป ให้รอจนกว่า max-age จะหมดอายุ (ตามที่ตั้งไว้เมื่อก่อน)
Error: "ไม่สามารถติดต่อเซิร์ฟเวอร์ได้" หลัง includeSubDomains เปิด
เกิดเมื่อใส่ includeSubDomains แต่ Subdomain บางตัวไม่มี SSL Certificate ที่ถูกต้อง เบราว์เซอร์จึงปฏิเสธที่จะเชื่อมต่อกับ Subdomain นั้น
วิธีแก้: ตรวจสอบให้แน่ใจว่า Subdomain ทั้งหมดที่คุณใช้งาน (www, api, blog, mail เป็นต้น) มี SSL Certificate ที่ถูกต้องแล้ว หรือควรลบ includeSubDomains ออกจากนั้นและเปิดเฉพาะ Domain หลักเท่านั้น
Error: "ไฟล์ .htaccess ไม่ได้รับการรับรู้" หรือไม่มี HSTS Header
อาจเกิดจาก:
- mod_headers ไม่ติดตั้ง — บางเซิร์ฟเวอร์ไม่เปิดใช้งาน Apache mod_headers ให้ติดต่อ Hosting Provider ขอให้เปิดใช้
- AllowOverride ไม่เปิด — Apache อาจมีการตั้งค่าให้ .htaccess ไม่สามารถใช้ Override Header ได้ ลองติดต่อ Hosting Provider
- .htaccess อยู่ในตำแหน่งผิด — .htaccess ต้องอยู่ในโฟลเดอร์ root ของเว็บไซต์ (public_html) ถ้าวางไว้ใน subfolder มันจะมีผลเฉพาะ subfolder นั้นเท่านั้น
วิธีแก้: ลองไฟล์ .htaccess ชั่วคราว (สำรองสำเนาไว้ก่อน) แล้วใส่บรรทัดง่าย ๆ เช่น Header set Test-Header "Hello" แล้วทดสอบด้วย curl ว่ามี Header Test-Header ออกมาหรือไม่ ถ้าไม่มี แสดงว่า mod_headers หรือ AllowOverride ไม่เปิด ให้ติดต่อ Hosting Provider
Error: "เบราว์เซอร์จำ HSTS เก่าไว้ ไม่อัพเดท"
เมื่อคุณลด max-age เนื่องจากต้องการแก้ปัญหา บางเบราว์เซอร์อาจจำค่า HSTS ที่เก่าไว้เสมอ ไม่ใช้ค่าใหม่ทันที
วิธีแก้:
- ล้าง Browser Cache — ลบ Cookies, Browsing Data ของเว็บไซต์นั้นออกใน Settings เลือก "Clear browsing data" เลือก "Cookies and other site data"
- ใช้ Incognito Mode — เปิดเบราว์เซอร์ Incognito (ไม่จดจำข้อมูล) ทดสอบว่าปัญหายังเกิดหรือไม่
- รอให้ HSTS Max-age หมดอายุ — ถ้าตั้ง max-age เป็น 1 ปีเก่า ต้องรอให้หมดเวลาหรือเบราว์เซอร์จะจำตำแหน่งนั้นจากที่ได้รับ
Error: "ไม่สามารถรีเซ็ต HSTS Preload ได้" หรือ "เว็บไซต์ถูกล็อก"
ถ้าคุณเคยสมัคร Preload List และเพิ่ม preload ลงใน HSTS Header และตอนนี้ต้องการลบมัน อาจต้องใช้เวลา นานกว่า max-age หมดอายุ เนื่องจาก Preload List ถูกฝังในตัวเบราว์เซอร์
วิธีแก้: ไปที่ https://hstspreload.org แล้วค้นหาโดเมนของคุณ ถ้าอยู่ในรายการ ให้ Submit for Removal เพื่อขอให้ลบออกจากรายการ โดยปกติจะใช้เวลาไม่กี่สัปดาห์เมื่ออัพเดตเบราว์เซอร์เวอร์ชั่นใหม่
คำถามที่พบบ่อย
Q: HSTS และ Redirect HTTP to HTTPS มีความต่างกันอย่างไร?
A: Redirect HTTP to HTTPS คือการส่งข้อบอก (301 Redirect) ให้เบราว์เซอร์ไปเปลี่ยนจาก HTTP ไปเป็น HTTPS ซึ่งต้องส่งมาทุกครั้งที่ผู้ใช้เข้าผ่าน HTTP ในขณะที่ HSTS คือการบอกเบราว์เซอร์ให้จดจำและไม่ต้องบอกทุกครั้ง เบราว์เซอร์จะจำค่าไว้และใช้ HTTPS โดยตรงเอง ดังนั้น ควรมี Redirect HTTP to HTTPS ประกอบกับ HSTS เพื่อรักษาความปลอดภัยสูงสุด
Q: ควรตั้ง max-age เป็นเท่าไรดี?
A: ค่าที่นิยมคือ 31536000 วินาที (1 ปี) สำหรับเว็บไซต์ที่มั่นใจว่า SSL ได้รับการบำรุงรักษาอย่างดี สำหรับเว็บไซต์ใหม่หรือทดสอบ ให้ใช้ค่าต่ำก่อนเช่น 300, 3600 หรือ 86400 วินาที แล้วค่อยเพิ่มขึ้นทีละน้อย แล้วควรแน่ใจก่อนว่า SSL ไม่มีปัญหาแล้ว
Q: เว็บไซต์ของฉันยังใช้ HTTP อยู่และไม่มี SSL ต้องทำอะไรก่อน?
A: ต้องติดตั้ง SSL Certificate ก่อน ซึ่งสามารถใช้ AutoSSL ใน cPanel ได้ฟรีผ่านการใช้ Let's Encrypt แล้วรีไดเรกต์ HTTP ไปยัง HTTPS ก่อน จากนั้นค่อยเปิด HSTS เมื่อแน่ใจว่า SSL ทำงานถูกต้องแล้ว