เจาะลึกนโยบาย Frontend Origin Isolation, กลไก, ประโยชน์, การนำไปใช้ และผลกระทบต่อความปลอดภัยเว็บยุคใหม่ เรียนรู้วิธีปกป้องผู้ใช้และข้อมูลของคุณ
นโยบายการแยก Origin ของ Frontend: การรักษาความปลอดภัยเว็บยุคใหม่
ในภูมิทัศน์ของเว็บที่ซับซ้อนมากขึ้นทุกวันนี้ ภัยคุกคามด้านความปลอดภัยก็มีวิวัฒนาการในอัตราที่น่าตกใจ มาตรการรักษาความปลอดภัยแบบดั้งเดิมมักไม่เพียงพอที่จะป้องกันการโจมตีที่ซับซ้อน นโยบาย Frontend Origin Isolation จึงกลายเป็นเครื่องมืออันทรงพลังในการเสริมสร้างความปลอดภัยของเว็บแอปพลิเคชันโดยการสร้างขอบเขตความปลอดภัยที่แข็งแกร่งระหว่าง origin ที่แตกต่างกัน คู่มือฉบับสมบูรณ์นี้จะเจาะลึกถึงความซับซ้อนของ Origin Isolation, กลไกเบื้องหลัง, กลยุทธ์การนำไปใช้ และผลกระทบอย่างลึกซึ้งที่มีต่อการปกป้องข้อมูลผู้ใช้และลดช่องโหว่ด้านความปลอดภัย
ทำความเข้าใจถึงความจำเป็นในการแยก Origin
รากฐานของความปลอดภัยบนเว็บตั้งอยู่บนนโยบาย Same-Origin Policy (SOP) ซึ่งเป็นกลไกสำคัญที่จำกัดไม่ให้หน้าเว็บเข้าถึงทรัพยากรจาก origin ที่แตกต่างกัน origin ถูกกำหนดโดย scheme (โปรโตคอล), host (โดเมน) และพอร์ต แม้ว่า SOP จะให้การป้องกันในระดับพื้นฐาน แต่ก็ไม่ได้ป้องกันได้ทั้งหมด การโต้ตอบข้าม origin บางอย่างได้รับอนุญาต ซึ่งมักนำไปสู่ช่องโหว่ที่ผู้ไม่หวังดีสามารถใช้ประโยชน์ได้ นอกจากนี้ การประนีประนอมในสถาปัตยกรรม CPU ในอดีต เช่น Spectre และ Meltdown ได้เน้นให้เห็นถึงศักยภาพของการโจมตีแบบ side-channel ที่สามารถทำให้ข้อมูลที่ละเอียดอ่อนรั่วไหลได้แม้จะอยู่ภายใน origin เดียวกัน Origin Isolation จัดการกับข้อจำกัดเหล่านี้โดยการสร้างขอบเขตความปลอดภัยที่เข้มงวดมากขึ้น
Origin Isolation คืออะไร?
Origin Isolation เป็นคุณสมบัติด้านความปลอดภัยที่แยก origin ของเว็บไซต์ของคุณออกจาก origin อื่นๆ ในกระบวนการของเบราว์เซอร์ การแยกนี้จะป้องกันไม่ให้ไซต์ของคุณเสี่ยงต่อการโจมตีข้ามไซต์บางประเภท เช่น Spectre และ Meltdown รวมถึงช่องโหว่ cross-site scripting (XSS) แบบดั้งเดิมที่อาจนำไปสู่การขโมยข้อมูล การใช้ Origin Isolation เท่ากับว่าคุณได้สร้างกระบวนการเฉพาะหรือชุดของกระบวนการเฉพาะสำหรับ origin ของคุณ ซึ่งจะจำกัดศักยภาพในการใช้ทรัพยากรร่วมกันและลดความเสี่ยงของการรั่วไหลของข้อมูล
องค์ประกอบสำคัญของ Origin Isolation
Origin Isolation ทำได้โดยการทำงานร่วมกันของ HTTP header ที่สำคัญสามตัว:
- Cross-Origin-Opener-Policy (COOP): header นี้ควบคุมว่า origin อื่นใดสามารถเปิดเว็บไซต์ของคุณเป็นป๊อปอัปหรือฝังไว้ใน
<iframe>ได้ การตั้งค่า COOP เป็นsame-origin,same-origin-allow-popupsหรือno-unsafe-noneจะป้องกันไม่ให้ origin อื่นเข้าถึง window object ของคุณโดยตรง ซึ่งเป็นการแยกบริบทการท่องเว็บของคุณอย่างมีประสิทธิภาพ - Cross-Origin-Embedder-Policy (COEP): header นี้สั่งให้เบราว์เซอร์บล็อกการโหลดทรัพยากรข้าม origin ใดๆ ที่ไม่ได้เลือกที่จะให้ origin ของคุณโหลดอย่างชัดเจน ทรัพยากรต้องถูกให้บริการพร้อมกับ header
Cross-Origin-Resource-Policy (CORP)หรือ header CORS (Cross-Origin Resource Sharing) - Cross-Origin-Resource-Policy (CORP): header นี้ช่วยให้คุณสามารถประกาศ origin ที่สามารถโหลดทรัพยากรที่เฉพาะเจาะจงได้ เป็นกลไกในการปกป้องทรัพยากรของคุณจากการถูกโหลดโดย origin ที่ไม่ได้รับอนุญาต
รายละเอียดของ Cross-Origin-Opener-Policy (COOP)
header COOP มีบทบาทสำคัญในการป้องกันการเข้าถึง window object ข้าม origin ค่าหลักๆ ได้แก่:
same-origin: นี่เป็นตัวเลือกที่เข้มงวดที่สุด โดยจะแยกบริบทการท่องเว็บไปยังเอกสารจาก origin เดียวกัน เอกสารจาก origin อื่นไม่สามารถเข้าถึงหน้าต่างนี้ได้โดยตรง และในทางกลับกันsame-origin-allow-popups: ตัวเลือกนี้อนุญาตให้ป๊อปอัปที่เปิดโดยเอกสารปัจจุบันยังคงสามารถเข้าถึงหน้าต่างที่เปิดมันได้ แม้ว่าหน้าต่างที่เปิดจะมีCOOP: same-originก็ตาม อย่างไรก็ตาม origin อื่นๆ ยังคงไม่สามารถเข้าถึงหน้าต่างได้unsafe-none: นี่คือพฤติกรรมเริ่มต้นหากไม่ได้ระบุ header ไว้ โดยจะอนุญาตให้มีการเข้าถึงหน้าต่างข้าม origin ซึ่งเป็นตัวเลือกที่ปลอดภัยน้อยที่สุด
ตัวอย่าง:
Cross-Origin-Opener-Policy: same-origin
รายละเอียดของ Cross-Origin-Embedder-Policy (COEP)
header COEP ถูกออกแบบมาเพื่อลดการโจมตีแบบ Spectre โดยกำหนดให้ทรัพยากรข้าม origin ทั้งหมดที่โหลดโดยเว็บไซต์ของคุณต้องเลือกที่จะให้ origin ของคุณโหลดอย่างชัดเจน ซึ่งทำได้โดยการตั้งค่า header Cross-Origin-Resource-Policy หรือใช้ CORS
ค่าหลักๆ ได้แก่:
require-corp: นี่เป็นตัวเลือกที่เข้มงวดที่สุด โดยกำหนดให้ทรัพยากรข้าม origin ทั้งหมดต้องถูกโหลดพร้อมกับ header CORP ที่อนุญาตให้ origin ของคุณโหลดได้อย่างชัดเจนcredentialless: คล้ายกับrequire-corpแต่จะไม่ส่งข้อมูลประจำตัว (คุกกี้, การยืนยันตัวตน HTTP) ไปกับคำขอข้าม origin ซึ่งมีประโยชน์สำหรับการโหลดทรัพยากรสาธารณะunsafe-none: นี่คือพฤติกรรมเริ่มต้น โดยจะอนุญาตให้โหลดทรัพยากรข้าม origin ได้โดยไม่มีข้อจำกัดใดๆ
ตัวอย่าง:
Cross-Origin-Embedder-Policy: require-corp
รายละเอียดของ Cross-Origin-Resource-Policy (CORP)
header CORP ช่วยให้คุณสามารถระบุได้ว่า origin ใดที่ได้รับอนุญาตให้โหลดทรัพยากรนั้นๆ โดยให้การควบคุมการเข้าถึงทรัพยากรข้าม origin อย่างละเอียด
ค่าหลักๆ ได้แก่:
same-origin: ทรัพยากรสามารถโหลดได้โดยคำขอจาก origin เดียวกันเท่านั้นsame-site: ทรัพยากรสามารถโหลดได้โดยคำขอจากไซต์เดียวกันเท่านั้น (scheme และ eTLD+1 เดียวกัน)cross-origin: ทรัพยากรสามารถโหลดได้โดย origin ใดก็ได้ ควรใช้ตัวเลือกนี้ด้วยความระมัดระวัง เพราะมันปิดการป้องกันของ CORP อย่างมีประสิทธิภาพ
ตัวอย่าง:
Cross-Origin-Resource-Policy: same-origin
การนำ Origin Isolation ไปใช้: คู่มือทีละขั้นตอน
การนำ Origin Isolation ไปใช้ต้องใช้วิธีการที่รอบคอบและเป็นระบบ นี่คือคำแนะนำทีละขั้นตอน:
- วิเคราะห์ Dependencies ของคุณ: ระบุทรัพยากรข้าม origin ทั้งหมดที่เว็บไซต์ของคุณโหลด รวมถึงรูปภาพ, สคริปต์, สไตล์ชีต และฟอนต์ ขั้นตอนนี้มีความสำคัญอย่างยิ่งในการทำความเข้าใจผลกระทบของการเปิดใช้งาน COEP ใช้เครื่องมือสำหรับนักพัฒนาในเบราว์เซอร์เพื่อดูรายการทั้งหมด
- ตั้งค่า CORP Headers: สำหรับแต่ละทรัพยากรที่คุณควบคุม ให้ตั้งค่า header
Cross-Origin-Resource-Policyที่เหมาะสม หากทรัพยากรนั้นมีไว้สำหรับให้ origin ของคุณเองโหลดเท่านั้น ให้ตั้งค่าเป็นsame-originหากมีไว้สำหรับให้ไซต์เดียวกันโหลด ให้ตั้งค่าเป็นsame-siteสำหรับทรัพยากรที่คุณไม่ได้ควบคุม ดูขั้นตอนที่ 4 - กำหนดค่า CORS: หากคุณต้องการโหลดทรัพยากรจาก origin อื่นและไม่สามารถตั้งค่า CORP headers บนทรัพยากรเหล่านั้นได้ คุณสามารถใช้ CORS เพื่ออนุญาตการเข้าถึงข้าม origin ได้ เซิร์ฟเวอร์ที่โฮสต์ทรัพยากรต้องรวม header
Access-Control-Allow-Originในการตอบกลับ ตัวอย่างเช่น หากต้องการอนุญาตคำขอจาก origin ใดๆ ให้ตั้งค่า header เป็นAccess-Control-Allow-Origin: *อย่างไรก็ตาม ควรตระหนักถึงผลกระทบด้านความปลอดภัยของการอนุญาตการเข้าถึงจาก origin ใดๆ การระบุ origin ที่อนุญาตอย่างเจาะจงมักจะดีกว่า - จัดการกับทรัพยากรที่คุณไม่ได้ควบคุม: สำหรับทรัพยากรที่โฮสต์บนโดเมนของบุคคลที่สามที่คุณไม่ได้ควบคุม คุณมีหลายทางเลือก:
- ขอ CORS Headers: ติดต่อผู้ให้บริการบุคคลที่สามและขอให้พวกเขาเพิ่ม CORS headers ที่เหมาะสมในการตอบกลับของพวกเขา
- ทำ Proxy ให้กับทรัพยากร: โฮสต์สำเนาของทรัพยากรบนโดเมนของคุณเองและให้บริการพร้อมกับ CORP headers ที่ถูกต้อง วิธีนี้อาจเพิ่มความซับซ้อนให้กับโครงสร้างพื้นฐานของคุณและอาจละเมิดข้อกำหนดในการให้บริการของบุคคลที่สาม ดังนั้นควรตรวจสอบให้แน่ใจว่าคุณได้รับอนุญาตที่จำเป็น
- หาทางเลือกอื่น: มองหาทรัพยากรทางเลือกที่คุณสามารถโฮสต์เองได้หรือที่มี CORS headers ที่ถูกต้องอยู่แล้ว
- ใช้
<iframe>(ด้วยความระมัดระวัง): โหลดทรัพยากรใน<iframe>และสื่อสารกับมันโดยใช้postMessageวิธีนี้เพิ่มความซับซ้อนอย่างมากและอาจมีผลกระทบต่อประสิทธิภาพ และอาจไม่เหมาะสำหรับทุกสถานการณ์
- ตั้งค่า COEP Headers: เมื่อคุณจัดการกับทรัพยากรข้าม origin ทั้งหมดแล้ว ให้ตั้งค่า header
Cross-Origin-Embedder-Policyเป็นrequire-corpซึ่งจะบังคับให้ทรัพยากรข้าม origin ทั้งหมดต้องถูกโหลดพร้อมกับ CORP หรือ CORS headers - ตั้งค่า COOP Headers: ตั้งค่า header
Cross-Origin-Opener-Policyเป็นsame-originหรือsame-origin-allow-popupsซึ่งจะแยกบริบทการท่องเว็บของคุณออกจาก origin อื่นๆ - ทดสอบอย่างละเอียด: ทดสอบเว็บไซต์ของคุณอย่างละเอียดหลังจากเปิดใช้งาน Origin Isolation เพื่อให้แน่ใจว่าทรัพยากรทั้งหมดโหลดอย่างถูกต้องและไม่มีข้อผิดพลาดที่ไม่คาดคิด ใช้เครื่องมือสำหรับนักพัฒนาในเบราว์เซอร์เพื่อระบุและแก้ไขปัญหาใดๆ
- ติดตามและปรับปรุง: ติดตามเว็บไซต์ของคุณอย่างต่อเนื่องเพื่อหาปัญหาที่เกี่ยวข้องกับ Origin Isolation และเตรียมพร้อมที่จะปรับการกำหนดค่าของคุณตามความจำเป็น
ตัวอย่างการใช้งานและ Code Snippets
ตัวอย่างที่ 1: การตั้งค่า Headers ใน Node.js ด้วย Express
const express = require('express');
const app = express();
app.use((req, res, next) => {
res.setHeader('Cross-Origin-Opener-Policy', 'same-origin');
res.setHeader('Cross-Origin-Embedder-Policy', 'require-corp');
res.setHeader('Cross-Origin-Resource-Policy', 'same-origin');
next();
});
app.get('/', (req, res) => {
res.send('Hello, Origin Isolated World!');
});
app.listen(3000, () => {
console.log('Server listening on port 3000');
});
ตัวอย่างที่ 2: การตั้งค่า Headers ใน Apache
ในไฟล์กำหนดค่า Apache ของคุณ (เช่น .htaccess หรือ httpd.conf):
Header set Cross-Origin-Opener-Policy "same-origin"
Header set Cross-Origin-Embedder-Policy "require-corp"
Header set Cross-Origin-Resource-Policy "same-origin"
ตัวอย่างที่ 3: การตั้งค่า Headers ใน Nginx
ในไฟล์กำหนดค่า Nginx ของคุณ (เช่น nginx.conf):
add_header Cross-Origin-Opener-Policy "same-origin";
add_header Cross-Origin-Embedder-Policy "require-corp";
add_header Cross-Origin-Resource-Policy "same-origin";
การแก้ไขปัญหาทั่วไป
การนำ Origin Isolation ไปใช้อาจทำให้เกิดปัญหาที่ไม่คาดคิดได้ในบางครั้ง นี่คือปัญหาทั่วไปและแนวทางการแก้ไข:
- ทรัพยากรโหลดไม่สำเร็จ: สาเหตุนี้มักเกิดจากการกำหนดค่า CORP หรือ CORS ที่ไม่ถูกต้อง ตรวจสอบอีกครั้งว่าทรัพยากรข้าม origin ทั้งหมดมี header ที่ถูกต้อง ใช้เครื่องมือสำหรับนักพัฒนาในเบราว์เซอร์เพื่อระบุทรัพยากรที่ล้มเหลวและข้อความแสดงข้อผิดพลาดที่เฉพาะเจาะจง
- ฟังก์ชันการทำงานของเว็บไซต์เสีย: คุณลักษณะบางอย่างของเว็บไซต์อาจต้องอาศัยการเข้าถึงข้าม origin ระบุคุณลักษณะเหล่านี้และปรับการกำหนดค่าของคุณให้เหมาะสม ลองพิจารณาใช้
<iframe>กับpostMessageสำหรับการสื่อสารข้าม origin ที่จำกัด แต่โปรดระวังผลกระทบด้านประสิทธิภาพ - ป๊อปอัปไม่ทำงาน: หากเว็บไซต์ของคุณใช้ป๊อปอัป คุณอาจต้องใช้
COOP: same-origin-allow-popupsเพื่ออนุญาตให้ป๊อปอัปยังคงเข้าถึงหน้าต่างที่เปิดมันได้ - ไลบรารีของบุคคลที่สามไม่ทำงาน: ไลบรารีของบุคคลที่สามบางตัวอาจเข้ากันไม่ได้กับ Origin Isolation มองหาไลบรารีทางเลือกหรือติดต่อผู้พัฒนาไลบรารีเพื่อขอการสนับสนุนสำหรับ CORP และ CORS
ประโยชน์ของ Origin Isolation
ประโยชน์ของการนำ Origin Isolation ไปใช้นั้นมีมากมาย:
- ความปลอดภัยที่เพิ่มขึ้น: ลดการโจมตีแบบ Spectre และ Meltdown รวมถึงช่องโหว่ข้ามไซต์อื่นๆ
- การปกป้องข้อมูลที่ดีขึ้น: ปกป้องข้อมูลผู้ใช้ที่ละเอียดอ่อนจากการเข้าถึงโดยไม่ได้รับอนุญาต
- ความน่าเชื่อถือที่เพิ่มขึ้น: แสดงให้เห็นถึงความมุ่งมั่นในด้านความปลอดภัย สร้างความไว้วางใจให้กับผู้ใช้และพันธมิตร
- การปฏิบัติตามข้อกำหนด: ช่วยให้เป็นไปตามข้อกำหนดด้านกฎระเบียบที่เกี่ยวข้องกับความเป็นส่วนตัวและความปลอดภัยของข้อมูล
ผลกระทบต่อประสิทธิภาพ
แม้ว่า Origin Isolation จะให้ประโยชน์ด้านความปลอดภัยอย่างมาก แต่ก็อาจส่งผลกระทบต่อประสิทธิภาพของเว็บไซต์ได้เช่นกัน การแยกที่เพิ่มขึ้นอาจนำไปสู่การใช้หน่วยความจำและ CPU ที่สูงขึ้น อย่างไรก็ตาม ผลกระทบด้านประสิทธิภาพโดยทั่วไปมีน้อยและมักจะถูกบดบังด้วยประโยชน์ด้านความปลอดภัย นอกจากนี้ เบราว์เซอร์สมัยใหม่ยังได้รับการปรับให้เหมาะสมอย่างต่อเนื่องเพื่อลดภาระของ Origin Isolation
นี่คือกลยุทธ์บางส่วนเพื่อลดผลกระทบด้านประสิทธิภาพ:
- ปรับปรุงการโหลดทรัพยากร: ตรวจสอบให้แน่ใจว่าเว็บไซต์ของคุณกำลังโหลดทรัพยากรอย่างมีประสิทธิภาพ โดยใช้เทคนิคต่างๆ เช่น code splitting, lazy loading และการแคช
- ใช้ CDNs: ใช้ Content Delivery Networks (CDNs) เพื่อกระจายทรัพยากรของคุณตามภูมิศาสตร์ ซึ่งจะช่วยลดความหน่วงและปรับปรุงเวลาในการโหลด
- ตรวจสอบประสิทธิภาพ: ตรวจสอบประสิทธิภาพของเว็บไซต์ของคุณอย่างต่อเนื่องและระบุปัญหาคอขวดที่เกี่ยวข้องกับ Origin Isolation
Origin Isolation และอนาคตของความปลอดภัยบนเว็บ
Origin Isolation เป็นก้าวสำคัญในด้านความปลอดภัยบนเว็บ ในขณะที่เว็บแอปพลิเคชันมีความซับซ้อนและขับเคลื่อนด้วยข้อมูลมากขึ้น ความต้องการมาตรการรักษาความปลอดภัยที่แข็งแกร่งก็จะเพิ่มขึ้นอย่างต่อเนื่อง Origin Isolation เป็นรากฐานที่มั่นคงสำหรับการสร้างประสบการณ์บนเว็บที่ปลอดภัยและน่าเชื่อถือยิ่งขึ้น ในขณะที่ผู้จำหน่ายเบราว์เซอร์ยังคงปรับปรุงและพัฒนา Origin Isolation ต่อไป มีแนวโน้มว่ามันจะกลายเป็นแนวปฏิบัติมาตรฐานสำหรับนักพัฒนาเว็บทุกคน
ข้อควรพิจารณาในระดับโลก
เมื่อนำ Origin Isolation ไปใช้สำหรับผู้ชมทั่วโลก ควรพิจารณาสิ่งต่อไปนี้:
- Content Delivery Networks (CDNs): ใช้ CDNs ที่มี points of presence (POPs) ทั่วโลกเพื่อให้แน่ใจว่าการเข้าถึงทรัพยากรของคุณมีความหน่วงต่ำ ไม่ว่าผู้ใช้จะอยู่ที่ใด CDNs ยังช่วยลดความซับซ้อนของกระบวนการตั้งค่า HTTP headers ที่ถูกต้อง รวมถึง COOP, COEP และ CORP
- Internationalized Domain Names (IDNs): ตรวจสอบให้แน่ใจว่าเว็บไซต์และทรัพยากรของคุณสามารถเข้าถึงได้โดยใช้ IDNs จัดการการจดทะเบียนโดเมนและการกำหนดค่า DNS ของคุณอย่างระมัดระวังเพื่อหลีกเลี่ยงการโจมตีแบบฟิชชิงและรับประกันการเข้าถึงที่สอดคล้องกันสำหรับผู้ใช้ที่มีความชอบด้านภาษาที่แตกต่างกัน
- การปฏิบัติตามกฎหมายและข้อบังคับ: ตระหนักถึงกฎระเบียบด้านความเป็นส่วนตัวและความปลอดภัยของข้อมูลในประเทศและภูมิภาคต่างๆ Origin Isolation สามารถช่วยให้คุณปฏิบัติตามกฎระเบียบต่างๆ เช่น GDPR (General Data Protection Regulation) ในสหภาพยุโรป และ CCPA (California Consumer Privacy Act) ในสหรัฐอเมริกา
- การเข้าถึงได้ (Accessibility): ตรวจสอบให้แน่ใจว่าเว็บไซต์ของคุณยังคงสามารถเข้าถึงได้โดยผู้ใช้ที่มีความพิการหลังจากนำ Origin Isolation ไปใช้ ทดสอบเว็บไซต์ของคุณด้วยเทคโนโลยีช่วยเหลือและปฏิบัติตามแนวทางการเข้าถึงเนื้อหาบนเว็บ เช่น WCAG (Web Content Accessibility Guidelines)
- บริการของบุคคลที่สาม: ประเมินแนวปฏิบัติด้านความปลอดภัยและความเป็นส่วนตัวของบริการของบุคคลที่สามที่คุณรวมเข้ากับเว็บไซต์ของคุณอย่างรอบคอบ ตรวจสอบให้แน่ใจว่าบริการเหล่านี้สนับสนุน Origin Isolation และปฏิบัติตามกฎระเบียบที่เกี่ยวข้อง
สรุป
นโยบาย Frontend Origin Isolation เป็นกลไกความปลอดภัยอันทรงพลังที่สามารถเพิ่มความปลอดภัยของเว็บแอปพลิเคชันได้อย่างมีนัยสำคัญ ด้วยการทำความเข้าใจหลักการพื้นฐาน การใช้ header ที่ถูกต้อง และการจัดการกับปัญหาที่อาจเกิดขึ้น นักพัฒนาสามารถสร้างประสบการณ์บนเว็บที่ปลอดภัยและน่าเชื่อถือยิ่งขึ้นสำหรับผู้ใช้ทั่วโลก แม้ว่าการนำไปใช้จะต้องมีการวางแผนและทดสอบอย่างรอบคอบ แต่ประโยชน์ของ Origin Isolation ก็มีมากกว่าความท้าทายอย่างมาก จงยอมรับ Origin Isolation เป็นองค์ประกอบสำคัญของกลยุทธ์ความปลอดภัยบนเว็บของคุณ และปกป้องผู้ใช้และข้อมูลของคุณจากภูมิทัศน์ของภัยคุกคามที่เปลี่ยนแปลงอยู่เสมอ