בקשה לבידוד ביצועים באמצעות הכותרת 'אשכול סוכנים לפי מקור'

כותרת תגובת HTTP חדשה להגבלת כתיבת סקריפטים ברמת הדומיין ולבקשת משאבים ייעודיים מהדפדפן.

Domenic Denicola
Domenic Denicola

Origin-Agent-Cluster היא כותרת תגובה חדשה של HTTP, שמנחה את הדפדפן למנוע גישה סינכרונית באמצעות כתיבת סקריפט בין דפים ממקורות שונים באותו אתר. גם דפדפנים יכולים להשתמש Origin-Agent-Cluster כרמז לכך שהמקור צריך לקבל משאבים נפרדים משלו, כמו תהליך ייעודי.

תאימות דפדפן

בשלב הזה, הכותרת Origin-Agent-Cluster מוטמעת רק ב-Chrome 88 ואילך. הוא תוכנן בשיתוף פעולה הדוק עם נציגים מ-Mozilla Firefox שסימנו אותו כשווה ערך ליצור את האב טיפוס, ויש לו ערך חיובי ראשוני קליטה של WebKit, מנוע הדפדפן שמשמש את Safari.

אבל בינתיים, אין בעיה בפריסת הכותרת Origin-Agent-Cluster בכל משתמשים כיום. דפדפנים שלא מבינים את ההודעה, פשוט יתעלמו ממנה. ומכיוון שדפים ב- אשכולות סוכנים המשויכים למקור יכולים לבצע פחות פעולות מאשר אשכולות עם קידוד לפי אתר כברירת מחדל), אין בעיה של יכולת פעולה הדדית.

למה דפדפנים לא יכולים להפריד באופן אוטומטי מקורות של אותו אתר

האינטרנט מבוסס על מדיניות המקור הזהה, שהיא תכונת אבטחה מגביל את האופן שבו מסמכים וסקריפטים יכולים לקיים אינטראקציה עם משאבים origin. לדוגמה, דף המתארח בכתובת https://a.example נמצא מקור שונה מקוד אחד ב-https://b.example או במקור ב-https://sub.a.example.

מאחורי הקלעים, דפדפנים מפרידים בין המקורות בדרכים שונות. בממשק הישן ימים, למרות שמקורות נפרדים לא יוכלו לגשת לנתונים אחד של השני, הם עדיין לשתף משאבים כמו שרשורים של מערכת ההפעלה, תהליכים והקצאת זיכרון. כלומר, אם כרטיסייה אחת הייתה איטית, היא הייתה מאטה את כל שאר הכרטיסיות. לחלופין, אם כרטיסייה אחת משתמשת ביותר מדי זיכרון, תגרום לקריסת הדפדפן כולו.

הדפדפנים כיום הם מתוחכמים יותר, ומנסים להפריד בין מקורות שונים תהליכים. אופן הפעולה הזה משתנה בהתאם לדפדפן: ברוב הדפדפנים יש הפרדה מסוימת בין כרטיסיות, אך מסגרות iframe שונות בתוך כרטיסייה אחת עשויות לחלוק תהליך. ובגלל שהתהליכים בגלל תקורת הזיכרון, הם משתמשים בהיוריסטיקה כדי למנוע יותר מדי זיכרון: למשל, Firefox כולל מגבלת תהליך שהמשתמש יכול להגדיר, ו-Chrome משתנה בין מחשבים (שבהם יש יותר זיכרון) לבין מכשיר נייד (שבהם כמעט).

ההיוריסטיקה האלה לא מושלמת. ויש להם מגבלה חשובה: חריגים למדיניות המקור הזהה שמאפשרת לתת-דומיינים כמו https://sub.a.example וגם https://a.example כדי לתקשר זה עם זה, דפדפנים לא יכולים להפריד באופן אוטומטי תת-דומיינים מתוך שתי רשתות נוירונים זו מול זו.

התנהגות ברירת המחדל הזו נקראת 'אשכולות סוכנים המשויכים לאתר': כלומר, הדפדפן מקבץ דפים באתר שלהם. בכותרת החדשה של Origin-Agent-Cluster מוצגת בקשה לשנות את ברירת המחדל בדפדפן של דף נתון, הכנסתו לאשכול סוכנים המשויכים למקור, כך שהוא יקובץ רק לדפים אחרים מאותו מקור. באופן ספציפי, דפים ממקורות שונים מאותו אתר יוחרג מאשכול הסוכנים.

הפרדת הבעת ההסכמה הזו מאפשרת לדפדפנים לתת לאשכולות הסוכנים החדשים האלה המשויכים למקור משלהם משאבים ייעודיים, שלא משולבים עם מקורות מידע אחרים. לדוגמה, דפים כאלה יכולים ליצור תהליך משלהם או לתזמן אותם בשרשורים נפרדים. על ידי הוספת הכותרת Origin-Agent-Cluster לדף שלך, אתה מציין לדפדפן שהדף להפיק תועלת ממשאבים ייעודיים כאלה.

עם זאת, כדי לבצע את ההפרדה וליהנות מהיתרונות האלה, הדפדפן צריך להשבית חלק מהתכונות מהדור הקודם.

מה לא ניתן לעשות בדפים עם קידוד לפי מקור

כשהדף שלכם נמצא באשכול סוכנים המשויכים למקור, אתם מוותרים על יכולות מסוימות לדבר עם אותו אתר דפים ממקורות שונים שהיו זמינים בעבר. הקפידו במיוחד על הדברים הבאים:

  • אין לך יותר אפשרות להגדיר document.domain זהו תכונה מדור קודם שבדרך כלל מאפשרת לדפים ממקורות שונים באותו אתר לגשת לכל אחד מהם באופן סינכרוני ב-DOM של אחרים, אבל באשכולות סוכנים המשויכים למקור, הוא מושבת.

  • אין לך יותר אפשרות לשלוח WebAssembly.Module אובייקטים לדפים אחרים ממקורות שונים באותו אתר דרך postMessage().

  • (Chrome בלבד) כבר אי אפשר לשלוח SharedArrayBuffer או WebAssembly.Memory אובייקטים לדפים אחרים ממקורות שונים באותו אתר.

מתי כדאי להשתמש באשכולות סוכנים המשויכים למקור

המקורות שמהם מפיקים הכי הרבה תועלת מהכותרת Origin-Agent-Cluster הם:

  • להשיג את הביצועים הטובים ביותר בעזרת המשאבים הייעודיים שלהם, כשהדבר אפשרי. לדוגמה: משחקים עתירי ביצועים, אתרים לשיחות ועידה בווידאו או אפליקציות ליצירת מולטימדיה.

  • מכיל מסגרות iframe שצורכות משאבים רבים ממקורות שונים, אבל באותו אתר. לדוגמה, אם ב-https://mail.example.com מוטמע https://chat.example.com iframes, קוד מקור https://mail.example.com/ מוודא שהקוד שנכתב על ידי צוות הצ'אט לא יכול בטעות להפריע לקוד שנכתב על ידי צוות הדואר, ולרמז על כך לדפדפן כדי לתזמן אותן בנפרד ולצמצם את השפעת הביצועים שלהן אחת על השנייה.

  • מצפים להיות מוטמעים בדפים ממקור אחר באותו אתר, אבל יודעים שהם מוטמעים עתיר משאבים. לדוגמה, אם https://customerservicewidget.example.com מצפה להשתמש משאבים רבים לווידאו צ'אט, שיוטמעו במקורות שונים https://*.example.com, הצוות שמנהל את הווידג'ט הזה יכול להשתמש ברכיב Origin-Agent-Cluster כדי לנסות להפחית את השפעת הביצועים שלהם על כלי הטמעה.

בנוסף, עליך לוודא שמקובל עליך להשבית את המודעות שמופיעות לעיתים רחוקות, בתכונות של תקשורת בין מקורות, ושהאתר שלכם משתמש HTTPS.

אבל בסופו של דבר, אלה רק הנחיות. אם אשכולות סוכנים המשויכים למקור יעזרו לאתר שלך או לא ייקבע בדרך הטובה ביותר באמצעות מדידות. באופן ספציפי, צריך למדוד מדדי חוויית המשתמש, ואולי גם את הזיכרון בשימוש, כדי לראות את ההשפעה של קידוד לפי מקור. (שימוש בזיכרון במשך במיוחד הוא חשש משמעותי, מפני שהגדלת מספר התהליכים להפעלה עלולה לגרום תקורת זיכרון לכל תהליך). לא צריך פשוט לפרוס את קוד המקור ולקוות לטוב.

איך זה קשור לבידוד בין מקורות?

קידוד המקור של אשכולות סוכנים באמצעות הכותרת Origin-Agent-Cluster קשור אבל נפרד מבידוד בין מקורות דרך Cross-Origin-Opener-Policy וגם Cross-Origin-Embedder-Policy כותרות.

כל אתר שיגרום לבידוד חוצה-מקורות להשבית גם את אותו אותו אתר ממקור אחר תכונות תקשורת כמו בשימוש בכותרת Origin-Agent-Cluster. אבל, הכותרת Origin-Agent-Cluster עדיין יכולה להיות שימושית בנוסף לבידוד ממקורות שונים, רמז לדפדפן כדי לשנות את היוריסטיקה שלו להקצאת המשאבים. אז עדיין כדאי לחשוב החלת הכותרת Origin-Agent-Cluster ומדידת התוצאות, גם בדפים כבר מבודד ממקורות שונים.

איך להשתמש בכותרת Origin-Agent-Cluster

כדי להשתמש בכותרת Origin-Agent-Cluster, צריך להגדיר את שרת האינטרנט כך שישלח את קוד ה-HTTP הבא כותרת תגובה:

Origin-Agent-Cluster: ?1

הערך של ?1 הוא המבנה תחביר כותרת של true בוליאני עם ערך מסוים.

חשוב לשלוח את הכותרת הזו בכל התגובות מהמקור, לא רק בדפים מסוימים. אחרת, יכול להיות שיוצגו לך תוצאות לא עקביות כשהדפדפן "זוכר". רואה קידוד לפי מקור ולכן הוא מקושר למפתחות מקור גם בדפים שלא מבקשים אותו. או להיפך: אם הדף הראשון למשתמש מבקר אין כותרת, הדפדפן יזכור שהמקור לא רוצה עם קידוד לפי מקור, ותתעלם מהכותרת בדפים הבאים.

למה הדפדפן לא תמיד יכול לפעול בהתאם לכותרת?

הסיבה ל'זיכרון' הזה היא לשמור על עקביות בהזנת המקור. אם דפים מסוימים המקור היה עם קידוד לפי מקור, בעוד שאחרים לא כן, היו יכולים להיות לכם שני דפים מאותו מקור באשכולות סוכנים שונים, ולכן לא יכולנו לדבר זה עם זה. זה יהיה מאוד מוזר, גם למפתחי אתרים וגם הפנימית של הדפדפן. כלומר, המפרט לערך Origin-Agent-Cluster, המערכת מתעלמת מהכותרת אם היא לא תואמת לזו הקודמת מופיע עבור מקור נתון. ב-Chrome, פעולה כזו תגרום להצגת אזהרה במסוף.

העקביות הזו בהיקף של קבוצת הקשר של גלישה, שהיא קבוצה של כרטיסיות, חלונות או מסגרות iframe שיכולות להגיע זה לזה באמצעות מנגנונים כמו window.opener, frames[0] או window.parent. המשמעות היא שלאחר שהוסדרה הגדרת קידוד לפי אתר או מקור של מקור (על ידי של הדפדפן רואה או לא רואה את הכותרת), כדי לשנות אותו צריך לפתוח כותרת חדשה לגמרי לא מחוברת לתוכן הישן בשום צורה.

הפרטים האלה יכולים להיות חשובים לבדיקת הכותרת של Origin-Agent-Cluster. בפעם הראשונה שמוסיפים אותו באתר שלך, רק טעינה מחדש של הדף לא תעבוד. צריך לסגור את הכרטיסייה ולפתוח כרטיסייה חדשה אחת.

כדי לבדוק אם הכותרת Origin-Agent-Cluster מוחלת, צריך להשתמש ב-JavaScript נכס window.originAgentCluster. הערך יהיה true במקרים שבהם הכותרת (או כותרת אחרת) מנגנונים כמו בידוד בין מקורות) גרמו ליצירת קידוד לפי מקור; false מתי הוא לא עשה זאת; וגם undefined בדפדפנים שלא מטמיעים את הכותרת Origin-Agent-Cluster. רישום הנתונים האלה בפלטפורמה לניתוח הנתונים יכול לספק בדיקה חשובה שהגדרתם השרת שלך בצורה הנכונה.

לבסוף, חשוב לזכור שהכותרת Origin-Agent-Cluster תפעל רק במצב מאובטח הקשרים, כלומר ב-HTTPS או ב-http://localhost. דפי HTTP שאינם מקומיים מארח לא תומכים בסוכן עם קידוד לפי מקור אשכולות.

קידוד מקור הוא לא אמצעי אבטחה

למרות שהשימוש באשכול סוכנים המשויכים למקור בידוד את המקור מגישה סינכרונית בדפים ממקורות שונים באותו אתר, הוא לא נותן הגנה כותרות שקשורות לאבטחה, כמו Cross-Origin-Resource-Policy וגם Cross-Origin-Opener-Policy. באופן ספציפי, היא לא מספקת הגנה אמינה מפני מתקפות בערוץ צדדי כמו Spectre.

זה אולי קצת מפתיע, כי קידוד לפי מקור יכול לגרום לפעמים למקור לקבל קוד נפרד. ותהליכים נפרדים הם הגנה חשובה מפני התקפות ערוץ צדדי. אבל חשוב לזכור שהכותרת Origin-Agent-Cluster היא רק רמז בנושא הזה. הדפדפן לא מכיל את חובה לתת למקור תהליך נפרד, ויכול להיות שהוא לא עושה זאת מסיבות שונות:

  • יכול להיות שהדפדפן לא יטמיע את הטכנולוגיה לביצוע הפעולה הזו. לדוגמה, כרגע Safari ו-Firefox יכולים להוסיף כרטיסיות נפרדות לתהליכים משלהם, אבל עדיין לא לעשות זאת עבור iframes.

  • הדפדפן עשוי להחליט שלא כדאי להשקיע את התקורה של תהליך נפרד. לדוגמה, ב- במכשירי Android עם נפח זיכרון נמוך או ב-Android WebView, דפדפן Chrome משתמש בכמה שפחות תהליכים.

  • יכול להיות שהדפדפן ירצה לכבד את הבקשה שצוינה בכותרת Origin-Agent-Cluster, אבל היא יכולה לעשות זאת באמצעות טכנולוגיית בידוד שונה מזו של תהליכים. לדוגמה, Chrome הוא מה חדש באמצעות שרשורים במקום תהליכים לבידוד כזה של ביצועים.

  • יכול להיות שהמשתמש, או הקוד שפועל באתר אחר, כבר ניווט לדף עם קידוד לאתר במקור, וכתוצאה מכך מבטיחים העקביות אפשר להתעלם מהכותרת Origin-Agent-Cluster.

לכן, חשוב לא להתייחס לאשכולות סוכנים המשויכים למקור כתכונת אבטחה. במקום זאת, זו דרך לעזור לדפדפן לתעדף את הקצאת המשאבים, כי היא מרמזת של מקורות המידע שלכם יפיקו תועלת ממשאבים ייעודיים (ואתם מוכנים לוותר על חלקים מסוימים . בתמורה לכך).

משוב

הצוות של Chrome ישמח לשמוע ממך אם את/ה משתמש/ת בOrigin-Agent-Cluster או שוקלים להשתמש בו הכותרת. העניין הציבורי והתמיכה שלך עוזרים לנו לתת עדיפות לתכונות ולהציג לספקי דפדפנים כמה הם חשובים. ציוץ אל @ChromiumDev ואל רוצה לספר ל-Chrome DevRel על המחשבות ועל החוויות שלך?

אם יש לך שאלות נוספות לגבי המפרט או פרטים על אופן הפעולה של התכונה, תוכל מציגים בעיה במאגר סטנדרטי של HTML ב-GitHub. ואם אם תיתקל בבעיות ביישום של Chrome, תוכל לדווח על באג בכתובת new.crbug.com כאשר שדה הרכיבים מוגדר ל-Internals>Sandbox>SiteIsolation.

מידע נוסף

כדי לקבל מידע נוסף על אשכולות סוכנים המשויכים למקור, אפשר להתעמק בפרטים בקישורים הבאים: