GraphQL הוא גם שפת שאילתות עבור APIs וגם סביבת ריצה לביצוע השאילתות עם הנתונים הקיימים שלך. הוא מציע תיאור מקיף וברור של הנתונים הזמינים ב-API שלך, מאפשר ללקוחות לבקש בדיוק מה שהם צריכים ללא עודף, מקל על אבולוציה של APIs עם הזמן, ותומך בכלים חזקים עבור מפתחים.
בקרת גישה ל-GraphQL ואופטימיזציית שאילתות
בקרת גישה
הזדהות היא קבוצת חוקים או לוגיקה עסקית שקובעת אם למשתמש, סשן או הקשר יש את רשימת בקרת הגישה (ACL) לבצע פעולות מסוימות או לצפות בנתונים ספציפיים.
התנהגות כזו צריכה להיות נאכפת בשכבת הלוגיקה העסקית. אף על פי שעשוי להיות מפתה לשים את לוגיקת ההזדהות ישירות בשכבת GraphQL, זה בדרך כלל יותר מתאים לטפל בזה במקום אחר.
אופטימיזציית שאילתות
אופטימיזציה של שאילתות GraphQL כוללת טכניקות כמו מינימיזציה של חיבורי נתונים מיותרים ועיבוד כדי לשפר את זמני התגובה ולהפחית את העומס על השרת. זה מביא ליישום יותר יעיל, מציע חוויית משתמש טובה יותר, מעורבות ושימור משתמשים משופרים, והגדלת יכולת ההתרחבות של השרת.
דרכים לאופטימיזציית שאילתות GraphQL
- N+1 (טעינה קבוצתית)
- טעינת יתר וטעינת חסר
- מטמון להפחתת השהיה
- פיצול לדפים
שיפור בקרת הגישה ל-GraphQL ואופטימיזציית שאילתות GraphQL
מנוע ההרשאות מאמת את ההרשאות של צמתים ושדות באמצעות רשימת בקרת גישה (ACL) ומייעל שאילתות GraphQL בהתבסס על ההרשאות. בנוסף, ה-N+1 Resolver משפר את הביצועים על ידי ריכוז השאילתות. גישה זו פותרת את בעיית ה-N+1.
שחקנים
- שאילתת GraphQL: בקשה שנשלחת על ידי לקוח לשרת GraphQL כדי למשוך נתונים ספציפיים.
- מנוע GraphQL: מתייחס לשירות המאפשר לך לבצע שאילתות GraphQL.
- מנוע ההרשאות: מאמת את ההרשאות של צמתים ושדות באמצעות ACL ומייעל את שאילתת GraphQL בהתבסס על הרשאות השדות.
- N+1 Resolver: מפחית את העומס והשהייה הקשורים לשאילתות מרובות במסד הנתונים, משפר את הביצועים והיעילות.
שיפור בקרת הגישה
יישום קיים
נניח שיש לאפליקציה מוצרים, ספקים וכתובות. גישה לנתוני ספקים וכתובות דורשת אימות משתמש, שניתן לנהל בקלות ברזולברים.
עם זאת, נתוני ספק מוגבלים למשתמשי ניהול, וחלק מהשדות של הספק נגישים רק לתפקידים ספציפיים. מצד שני, מוצרים הם ציבוריים וניתן לצפות בהם עם תפקיד בעל המוצר. הרצת השאילתה המוזכרת (איור 3) תחזיר נתוני מוצר יחד עם נתוני ספק וכתובת קשורים, מה שעלול להוביל לבעיה אבטחתית.
יישום משופר
צמתים ושדות של השאילתה מאומתים בהתאם להרשאות המשתמש, ושאילתת GraphQL אופטימלית נוצרה.
איור 4 הוא דוגמה כיצד ניתן ליישם אימות מותאם אישית ב-API של GraphQL באמצעות Node.js. בקוד הזה, התפקיד מופק מהכותרת Authorization ולאחר מכן נעשה בו שימוש, יחד עם השאילתה, כדי לאמת את ההרשאה.
בדוגמה הזו, אנחנו משתמשים בתפקיד ובהרשאה של משתמש מהמפגש או הבקשה ששולטים בגישה לשאילתות ומוטציות ספציפיות בסכמת GraphQL. הגדרנו את כללי התפקיד והרשאה בסכמת GraphQL לכל המשתמשים.
שיטה זו בודקת באופן רקורסיבי את התפקיד וההרשאה על כל הצמתים והשדות. אם צומת או שדה אינם מורשים, אז היא מבצעת אחת מהפעולות הבאות בהתאם לקונפיגורציה:
- הסרת צומת או שדה.
- החזרת שדה או צומת עם הודעת שגיאה.
- זריקת חריגה.
ברגע שהשאילתת GraphQL מאומתת מול הסכמה, שיטה זו תחזיר את השאילתת GraphQL האופטימלית.
שיפור אופטימיזציית שאילתת ORM באמצעות N+1
מימוש קיים
זו בעיה טכנית שמשפיעה על ביצועי שאילתה. זה עשוי לקרות ביישומים שמשתמשים במסגרת ORM (Object-Relational Mapping) כדי לגשת למסד נתונים.
זה עולה בדרך כלל כאשר היישום צריך לטעון אוסף של ישויות קשורות ממסד הנתונים.
נניח שישנם 2 מוצרים; יש לבצע 1 שאילתה כדי לאחזר את המוצרים ו-2 שאילתות נוספות כדי לאחזר את הספקים עבור כל מוצר בנפרד.
שאילתא אחת מאחזרת את רשימת המוצרים, ושאילתא נפרדת מביאה את הספקים עבור כל מוצר. מספר השאילתות לספק שווה למספר המוצרים.
מימוש משופר
כאשר הבקשה מגיעה לפתרון N+1, פתרון N+1 משפר את השאילות כדי למזער את מספר בקשות ממסד הנתונים על ידי הפחתתן לשאילתה אחת עבור הנתונים העיקריים ושאילתה נוספת עבור הנתונים הקשורים, כך שמפתיעים בעיה N+1.
- שאילתת נתונים עיקרית: שאילתה יחידה המאחזרת את קבוצת הנתונים העיקרית הנדרשת ליישום.
- שאילתת נתונים קשורים: שאילתה נוספת שמביאה כל נתונים קשורים הדרושים כדי להשלים את קבוצת הנתונים.
לאחר שכל פותרי השאילות הושלמו, השרת מחזיר את הנתונים המשופרים ללקוח בפורמט JSON.
מסקנה
הבהרנו כי המימוש של מנגנוני אישור עדינים, יחד עם צעדים נוספים לשיפור האבטחה, הוא קריטי לאבטחת ממשק GraphQL. זה כולל אבטחה ברמת הצומת וברמת השדה.
כפי שמתואר במאמר זה, בעיה של N+1 מתרחשת כאשר שאילתה שאינה מאותמנת מביאה לשימוש מוגזם במסד הנתונים ב-GraphQL. סיפקנו פתרון לעקום את בעיית ה-N+1. זה מוריד את שימוש המשאבים בשרת מסד הנתונים, תוך חסכון בעלויות ושיפור בקבילות. בנוסף, על ידי שיפור בביצועי השאילתה, זה משפר את חוויית המשתמש על ידי צמצום זמני התגובה של השאילתה.
Source:
https://dzone.com/articles/optimizing-fine-grained-graphql-access-control-and-queries