PracticU

ניהול סשן Session ב-NodeJS

בלי כתוביותעם כתוביות
PracticU › קורס NodeJS › ניהול סשן Session ב-NodeJS
מילון מושגים:
סשן - פרק זמן של פעילות רציפה בין משתמש למערכת, שבו נשמר מידע על מצבו, למשל לאחר התחברות לאתר.
Node.js - סביבת ריצה שמאפשרת להריץ קוד JavaScript מחוץ לדפדפן, בעיקר בצד השרת.
Middleware - שכבת תוכנה שמתווכת בין רכיבים ומטפלת בבקשות בדרכן, למשל לאימות, רישום לוג או עיבוד נתונים.
עוגייה - קובץ קטן שאתר שומר בדפדפן כדי לזכור מידע על המשתמש בין בקשות, למשל מצב התחברות או העדפות.
הצפנה - המרת מידע לצורה בלתי קריאה בעזרת מפתח, כך שרק מי שמחזיק במפתח המתאים יכול לפענח ולקרוא אותו.
נתיב - מחרוזת שמתארת את מיקומו של קובץ או תיקייה במערכת הקבצים, או כתובת של משאב בתוך אתר.
HTTP - פרוטוקול להעברת דפי אינטרנט ונתונים בין דפדפן לשרת. הגרסה המאובטחת שלו היא HTTPS.
JavaScript - שפת תכנות שרצה בעיקר בדפדפן ומוסיפה אינטראקטיביות לדפי אינטרנט. רצה גם בצד השרת באמצעות Node.js.

ניהול סשן Session ב-NodeJS
Session מאפשר לשמור בזיכרון של השרת מידע נפרד לכל לקוח, בלי קשר למסד הנתונים. ההרצאה מראה איך מגדירים אותו ב-Express, איך הוא מזהה כל לקוח ואיך מוכיחים שהמידע באמת נפרד לכל אחד.
איך זה עובד
1. התקנה והגדרה: מתקינים express-session, מייבאים אותו ומוסיפים כ-middleware עם אובייקט קונפיגורציה.
2. זיהוי הלקוח: לכל לקוח נוצר בשרת אובייקט משלו. השרת שולח ללקוח cookie שמכיל session ID, ובכל גלישה ה-cookie נשלח חזרה והשרת מוצא לפיו את האובייקט הנכון. ה-cookie לא מכיל את המידע עצמו, רק את המזהה.
3. אבטחה: מי שמשיג session ID יכול להתחזות ללקוח, ולכן מגדירים מפתח הצפנה (secret) לקידוד המזהה, מחרוזת כלשהי שממציאים.
4. שמירה: ב-request.session מציבים שדות כמו color ו-number, בדומה לדוגמה של cookies, אבל המידע נשמר בשרת. קריאה היא ממאפייני request.session, והשמדה היא עם request.session.destroy.
5. הוכחה שזה פר לקוח: משנים את המספר לערך אקראי עם Math.random. בכרום המספר נשאר קבוע בכל קריאה, גם בכרטיסייה או בחלון אחר, כי ה-cookie זהה. בדפדפן אחר (Internet Explorer) הערך undefined, ואחרי שמירה שם מתקבל מספר אחר, ובכרום המספר הראשון לא השתנה.
6. אחרי destroy: ה-cookie נשאר בדפדפן, אבל הערכים בשרת מתאפסים ומוחזרים כ-undefined.
הגדרות הקונפיגורציה
- name של ה-cookie: בדוגמה testerCookie.
- secret: מחרוזת להצפנת המזהה, בדוגמה kittens are cute.
- resave: true: בכל גלישה הספירה של זמן ה-timeout מתחילה מחדש. ברירת המחדל של ה-timeout היא כ-20 דקות ואפשר לשנות אותה.
- saveUninitialized: false: לא יוצרים session כשאין בו צורך.
שימו לב
- Session בשרת שונה מ-sessionStorage ו-localStorage של HTML5. אלה נשמרים בלקוח, גדולים יותר (עד כ-5 מגה) ולא נשלחים אוטומטית לשרת. הראשון דומה ל-cookie non-persistent והשני ל-persistent.
- ל-cookies יש עוד אפשרויות, למשל הגבלה לנתיב מסוים או גישה רק דרך HTTP ולא דרך JavaScript.
עכשיו אפשר לשמור בשרת מידע נפרד לכל משתמש, וההרצאה הבאה מראה לזה שימוש אמיתי.
השיעור הבא בקורס: יצירת סל קניות בחנות אונליין ב-NodeJS

פרקי ההרצאה: ניהול סשן Session ב-NodeJS

  1. 00:00

    מידע בזיכרון השרת לכל לקוח

  2. 00:49

    התקנת express-session והגדרתו

  3. 02:15

    זיהוי הלקוח לפי session ID

  4. 03:10

    מפתח הצפנה ל-session ID

  5. 03:46

    resave וזמן התפוגה של הסשן

  6. 04:43

    ההגדרה saveUninitialized

  7. 05:26

    שמירה, קריאה וניקוי של session

  8. 07:20

    בדיקת הסשן בדפדפן

תמלול ההרצאה: ניהול סשן Session ב-NodeJS

הטקסט המלא של הדקות הראשונות בהרצאה «ניהול סשן Session ב-NodeJS» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:07

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

  2. 00:32

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

  3. 00:59

    הקונספט הזה נקרא סשן. אז איך זה מתבצע? ראשית אנחנו מתקינים npm i, אנחנו רוצים להתקין אקספרס מקף סשן. יש לנו את ההתקנה, אנחנו רוצים פה למעלה ליצור אקספרס סשן, require express session בצורה כזאת, והדבר הראשון שאנחנו צריכים להגדיר זה middleware של אקספרס סשן, כאשר יש לנו צורך לתת קונפיגורציה כאן.

  4. 01:46

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

  5. 02:09

    אז אם כרגע מחוברים אלינו 40 לקוחות תביא אלינו 40 אובייקטים כל אובייקט משרת רק את הלקוח הספציפי שלו והשאלה מה שאני שואלת היא איך המערכת של ה-session בסרבר side יודעת מכל ה-40 אובייקטים איזה אובייקט שייך לאיזה לקוח?

  6. 02:27

    והתשובה, בכדי שהיא תנהל את זה, אז היא שולחת קוקי לקליינט שיש לו משהו שנקרא ID שמזהה את ה-session שלו בסרבר.

  7. 02:41

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

  8. 02:57

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

  9. 03:25

    לאנשים על ידי ה-Session ID, ולכן הפרנטר הבא שאנחנו נותנים זה איזשהו Encryption Key בשביל ה-Session ID, שהמערכת תערבל אותו, תקודד אותו בעזרת ה-Key הזה, וזה סתם מחרוזת שאנחנו ממציאים.

  10. 03:44

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

  11. 04:09

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

  12. 04:30

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

  13. 04:43

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

  14. 05:11

    בואו נתחיל לבנות לעצמנו ראשית איזושהי פונקציה סייב סשן ואנחנו רוצים להפעיל פה את הפונקציה הזאת שמקבלת requestResponse ואיך אנחנו משתמשים עם ה-session.

  15. 05:35

    אז ב-request קיים סשן ואנחנו יכולים להכניס אליו מה שבא לנו. בואו נכניס איזשהו color: RedRequestSessionNumber123 ממש דומה לדוגמה שעשינו עם הקוקיז אבל שימו לב שהמידע הזה נשמר פר לקוח בצד של השרת בצד של השרת לא בצד של הלקוח הדבר הבא בואו נעשה פה איזה קונסול לוג סייבד

  16. 06:13

    ורספונס אנד סיימנו בואו נבצע פונקציה נוספת ניקח את כל זה נשכפל ונקרא לפונקציה readSession. אנחנו רוצים לגשת console.log ואנחנו רוצים לבדוק מה ה-color.

  17. 06:40

    ה-Color נמצא ב-requestSession, מה ה-number? requestSession.number זה אנחנו לא צריכים, ופעילות אחרונה שהיינו רוצים לבצע זה clear, וזה requestSession, פה יש את האובייקט של ה-session שלנו, וזה הורס את הסשן עבור אותו לקוח.

  18. 07:13

    בואו נבצע פה console.log stride. מה שאנחנו רוצים לבצע זה רק לבדוק את זה. אז בואו נריץ ונגלוש. כרגע הוא אומר לי cannot get כמובן כי לא גלשתי לאחד מהרורטים האלה.

  19. 07:38

    אנחנו רוצים האמת גם להציג את ה-F12. בואו ניפטר רגע מהקוקי של הלנגוויג' שהיה לנו בעבר, נרפרש, ואנחנו רוצים לגלוש לסייב סשן, גו, ושימו לב שיש לי

לקורס המלא: קורס NodeJS אונליין בעברית

ההרצאה הקודמת: יצירת אתר עם ריבוי שפות ב-NodeJS

ההרצאה הבאה: יצירת סל קניות בחנות אונליין ב-NodeJS

הרצאות קשורות מקורסים אחרים

  • ניהול OU
  • Session object - חלק 1
  • חטיפה של HTTP Session
  • ניהול סיכונים

קורסים נוספים במסלול

  • קורס יסודות HTML - בניית אתר אינטרנט פשוט
  • קורס CSS 3 - בדגש על Flex & Grid
  • קורס Javascript כולל JQuery
  • קורס ג'אווה סקריפט מעשי - JavaScript
  • קורס TypeScript
  • קורס ריאקט - React