Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Redis

การจัดการเซสชันที่ปลอดภัยใน Next.js โดยใช้ Upstash Redis

ในคู่มือนี้ เราจะอธิบายการจัดการเซสชันในแอป Next.js โดยใช้ Upstash Redis โดยการเรียนรู้ว่า "เซสชัน" หมายถึงอะไรในเว็บแอปพลิเคชัน เหตุใด Redis จึงเป็นตัวเลือกที่เหมาะสมสำหรับการจัดการเซสชัน วิธีตั้งค่าฐานข้อมูล Upstash Redis และสุดท้าย วิธีรวมเข้ากับแอปพลิเคชัน Next.js

“เซสชั่น” คืออะไร?

ในเว็บแอปพลิเคชัน “เซสชัน” เป็นกลไกการจัดเก็บข้อมูลฝั่งเซิร์ฟเวอร์ชั่วคราวที่ใช้เพื่อรักษาสถานะการโต้ตอบของผู้ใช้กับแอปพลิเคชันผ่านคำขอ HTTP หลายรายการในช่วงเวลาที่กำหนด

เนื่องจาก HTTP เป็นโปรโตคอลไร้สถานะ ซึ่งหมายความว่าแต่ละคำขอมีความเป็นอิสระและไม่ "จดจำ" การโต้ตอบก่อนหน้านี้ เซสชันจึงอนุญาตให้เซิร์ฟเวอร์ติดตามและจัดเก็บข้อมูลเฉพาะของผู้ใช้ เช่น สถานะการตรวจสอบสิทธิ์ การตั้งค่า หรือกิจกรรมประเภทใด ๆ ของผู้ใช้ในช่วงเวลาที่อยู่บนเว็บไซต์

โดยทั่วไปเซสชันจะทำงานโดยการจัดเก็บ ID เซสชันที่ไม่ซ้ำกันบนฝั่งไคลเอ็นต์ ซึ่งโดยปกติจะอยู่ในคุกกี้ เซิร์ฟเวอร์ใช้ ID นี้เพื่อดึงข้อมูลที่เกี่ยวข้องกับเซสชันผู้ใช้จากที่จัดเก็บเซสชัน เช่น Redis ในบล็อกนี้ ทุกครั้งที่ผู้ใช้โต้ตอบกับไซต์

เซสชันในเว็บแอปพลิเคชันเป็นวิธีที่ดีเยี่ยมในการจัดการการโต้ตอบของผู้ใช้และการจัดการสถานะต่อไปนี้:

  • การตรวจสอบสิทธิ์ผู้ใช้ :เซสชันช่วยตรวจสอบสิทธิ์ผู้ใช้และจดจำสถานะการเข้าสู่ระบบในหน้าต่างๆ หรือแม้แต่หลังจากรีเฟรชแล้ว
  • การปรับเปลี่ยนในแบบของคุณ :เซสชันอนุญาตให้เซิร์ฟเวอร์จัดเก็บและดึงข้อมูล เช่น การตั้งค่าผู้ใช้ สถานะการตรวจสอบสิทธิ์ ฯลฯ
  • ความปลอดภัย :การจัดการเซสชันที่เหมาะสมสามารถปรับปรุงความปลอดภัยของแอปได้ เช่น การป้องกัน CSRF และการทำให้แน่ใจว่าผู้ใช้ที่ไม่ได้รับอนุญาตจะไม่เข้าถึงพื้นที่ที่ถูกจำกัด

เหตุใดจึงต้อง Redis สำหรับการจัดการเซสชัน

ทำไมไม่ :)

มีเหตุผลหลายประการในการใช้ Redis เป็นที่จัดเก็บเซสชันสำหรับการจัดการเซสชัน นี่คือข้อดีบางประการที่เกิดจากโครงสร้างของ Redis:

  • สถาปัตยกรรมข้อมูล :Redis เป็นที่จัดเก็บคีย์-ค่าในหน่วยความจำ คู่คีย์-ค่าสามารถจัดเก็บไว้ในแฮชได้ โดยที่แฮชเป็นประเภทบันทึกที่มีโครงสร้างเป็นคอลเลกชันของคู่ค่าฟิลด์ โครงสร้างนี้เหมาะสมอย่างยิ่งกับประเภทข้อมูลการจัดการเซสชันเพื่อรักษาข้อมูลเซสชันทั้งหมด เช่น ชื่อผู้ใช้ การตั้งค่าผู้ใช้ ฯลฯ ในรูปแบบคีย์-ค่าในแฮชต่อเซสชันผู้ใช้

  • ข้อมูลหมดอายุ :Redis มีฟังก์ชันในตัวเพื่อลบข้อมูลที่หมดอายุ ซึ่งจะช่วยให้แอปพลิเคชันเว็บสามารถจำกัดเซสชันของผู้ใช้ไว้ได้

  • เวลาแฝงต่ำ :เนื่องจากลักษณะ "ในหน่วยความจำ" ทำให้ Redis ทำงานเร็วมาก นั่นเป็นสาเหตุที่มักใช้สำหรับเซสชันผู้ใช้และข้อมูลแคช

  • ความสามารถในการขยายขนาด :Redis สร้างขึ้นเพื่อรองรับข้อมูลปริมาณมากและการรับส่งข้อมูลที่มีปริมาณข้อมูลสูง

นอกจากนี้ เรายังสามารถเปรียบเทียบ Redis กับวิธีหนึ่งที่ใช้กันทั่วไปในการจัดเก็บข้อมูลเซสชันผู้ใช้ คุกกี้ฝั่งไคลเอ็นต์ เพื่อตัดสินใจว่าเราต้องการติดตามวิธีใดในเว็บแอปพลิเคชันของเรา ข้อดีบางประการของ Redis เป็นที่จัดเก็บเซสชันเหนือคุกกี้ฝั่งไคลเอ็นต์:

  • มีความเสี่ยงน้อยต่อการถูกปลอมแปลงโดยผู้ใช้ :คุกกี้จะปรากฏแก่ผู้ใช้และผู้ใช้สามารถจัดการได้ Redis ช่วยให้เราสามารถปกป้องข้อมูลผู้ใช้จากการถูกจัดการโดยผู้ใช้

  • ถ่ายโอนข้อมูลระหว่างไคลเอนต์และเซิร์ฟเวอร์น้อยลง: เนื่องจากเราจัดเก็บข้อมูลเซสชันทั้งหมดไว้ใน Redis เราจึงไม่จำเป็นต้องจัดเก็บข้อมูลใดๆ ไว้ในเครื่องไคลเอ็นต์

  • การจัดเก็บเฉพาะ “SessionId” ในเครื่องไคลเอ็นต์: หากเราใช้ Redis เราต้องการเพียง sessionId เพื่อรับสำหรับแต่ละคำขอเพื่อให้ทราบว่าคำขอนี้อยู่ในเซสชันใด

การสร้างฐานข้อมูล Upstash Redis

ก่อนที่จะกระโดดเข้าสู่การตั้งค่า Upstash Redis เราควรเข้าใจข้อดีของ Upstash Redis ก่อน คงไม่สมเหตุสมผลเลยที่จะใช้เครื่องมือที่เราจะใช้โดยไม่เข้าใจว่าทำไมจึงควรใช้เครื่องมือเหล่านั้น ใช่ไหม

มาดูประโยชน์หลักของการใช้ Upstash Redis:

  • ไร้เซิร์ฟเวอร์: Upstash Redis เป็นฐานข้อมูลแบบไร้เซิร์ฟเวอร์ คุณไม่จำเป็นต้องบำรุงรักษาโครงสร้างพื้นฐาน กังวลเกี่ยวกับขนาดของฐานข้อมูลหรือการกำหนดค่าระดับต่ำอื่นๆ คุณเพียงแค่สร้างฐานข้อมูลและใช้งาน

  • การกระจายข้อมูลทั่วโลก: Upstash ช่วยให้คุณสามารถปรับใช้อินสแตนซ์ Redis ในภูมิภาคที่ใกล้กับผู้ใช้ของคุณ ซึ่งลดเวลาแฝงลงไปอีก สิ่งนี้เป็นประโยชน์อย่างยิ่งสำหรับแอปพลิเคชันที่กระจายไปทั่วโลก ทำให้มั่นใจได้ว่าพื้นที่เก็บข้อมูลเซสชันจะรวดเร็วและตอบสนองไม่ว่าผู้ใช้จะอยู่ที่ใดก็ตาม

  • จ่ายตามการใช้งาน: ไม่มีราคาเข้า คุณจ่ายเฉพาะสิ่งที่คุณใช้ คุณสามารถดูรายละเอียดราคาได้

ตกลง หากเราไม่มีคำถามเพิ่มเติมเกี่ยวกับสาเหตุที่เราใช้ Upstash Redis สำหรับการจัดการเซสชัน เราสามารถสร้างฐานข้อมูล Upstash Redis ได้

เราจะสร้างฐานข้อมูล Redis ผ่านคอนโซล Upstash

มาสร้างฐานข้อมูล Redis โดยคลิกปุ่ม "สร้างฐานข้อมูล" บทช่วยสอนนี้จะแสดงอีกครั้งว่าการสร้างฐานข้อมูล Upstash Redis นั้นง่ายและรวดเร็วเพียงใด

ในโมดอลที่ปรากฏขึ้น เราจะเลือกชื่อสำหรับฐานข้อมูลของเราและเลือกภูมิภาคสำหรับมัน การเลือกภูมิภาคเดียวกันกับบริการของคุณอาจเป็นการดีกว่า

หลังจากคลิกที่ปุ่มถัดไป เราจะเลือกแผนการกำหนดราคา ฉันชอบจ่ายตามที่คุณไปด้วยด้วยขีดจำกัดงบประมาณสูงสุด!

ตอนนี้ฐานข้อมูล Redis ของเราพร้อมแล้ว เราสามารถดูจุดสิ้นสุดของฐานข้อมูล รหัสผ่านเพื่อเชื่อมต่อกับฐานข้อมูล และพอร์ตบนแดชบอร์ด Redis เราจะต้องการข้อมูลนี้เมื่อเราต้องการเชื่อมต่อกับฐานข้อมูลจากเว็บแอปพลิเคชัน

การจัดการเซสชันที่ปลอดภัยใน Next.js โดยใช้ Upstash Redis

แค่นั้นแหละ!

การใช้ Upstash Redis ในแอป Nextjs

มาดูกันว่า Redis จะทำงานอย่างไรภายในโครงสร้างพื้นฐานของเว็บแอปพลิเคชัน:

  • ก่อนอื่นเราได้รับคำขอจากเบราว์เซอร์ไคลเอนต์โดยไม่มี sessionId ใด ๆ

  • เนื่องจากไม่มี sessionId ในคำขอ เราจึงสร้าง sessionId หนึ่งรายการและสร้างแฮชใน Redis

  • ส่งกลับ sessionId เป็นคุกกี้เพื่อตอบสนองต่อเครื่องไคลเอนต์

  • เมื่อเราได้รับคำขอ HTTP ใหม่พร้อม sessionId เราจะดึงข้อมูลเซสชันที่จำเป็นจาก Redis และใช้ข้อมูลดังกล่าวเมื่อตอบสนองต่อไคลเอ็นต์

นี่คือแผนภาพลำดับของบริการและการเชื่อมต่อกับ Redis เพื่อให้เห็นภาพกระบวนการได้ดีขึ้น:

การจัดการเซสชันที่ปลอดภัยใน Next.js โดยใช้ Upstash Redis

หากทุกอย่างดี เราสามารถสร้างแอป Nextjs ได้โดยการรันคำสั่งต่อไปนี้ในเทอร์มินัล เว้นแต่คุณจะมีแอป Nextjs

npx create-next-app@latest <project-name>

ตอนนี้เราจำเป็นต้องติดตั้ง Upstash Redis Typescript SDK

cd <project-name>
npm install @upstash/redis

หลังจากติดตั้งการขึ้นต่อกันที่จำเป็นแล้ว ตอนนี้เราสามารถสร้างอินเทอร์เฟซสำหรับจัดการ ID เซสชันในคุกกี้ของเบราว์เซอร์ของผู้ใช้และโต้ตอบกับ Upstash Redis ซึ่งเป็นที่เก็บข้อมูลเซสชันของแอปของเรา

เราจะใช้อินเทอร์เฟซนี้ใน 01 ไฟล์.

import { Redis } from '@upstash/redis'
import { cookies } from 'next/headers'
 
export const redis = new Redis({
 url: '<UPSTASH-REDIS-URL>',
 token: 'UPSTASH-REDIS-TOKEN',
})
 
type SessionId = string;
type Key = 'userName' | 'sessionStatus'; // other keys of the session data can be added.
 
export async function getSessionId(): SessionId | undefined {
 const cookieStore = await cookies();
 return cookieStore.get("session-id")?.value;
}
 
async function setSessionId(sessionId: SessionId): void {
 const cookieStore = await cookies();
 cookieStore.set("session-id", sessionId);
}
 
export async function getSessionIdAndCreateIfMissing() {
 const sessionId = await getSessionId();
 if (!sessionId) {
 const newSessionId = crypto.randomUUID();
 await setSessionId(newSessionId);
 
 return newSessionId;
 }
 
 return sessionId;
}
 
export async function get(key: Key, username: string = "") {
 const sessionId = await getSessionId();
 if (!sessionId) {
 return null;
 }
 return await redis.hget(`session-${username}-${sessionId}`, key);
}
 
export async function getAll(username: string = "") {
 const sessionId = await getSessionId();
 if (!sessionId) {
 return null;
 }
 return await redis.hgetall(`session-${username}-${sessionId}`);
}
 
export async function set(key: Key, value: string, username: string = "") {
 const sessionId = await getSessionIdAndCreateIfMissing();
 await redis.hset(`session-${username}-${sessionId}`, { [key]: value });
 return redis.expire(`session-${username}-${sessionId}`, 900);
}

มาตรวจสอบฟังก์ชันเหล่านี้กันดีกว่า

  • getSessionId :เราจะจัดเก็บรหัสเซสชันไว้ในคุกกี้ของเบราว์เซอร์ของผู้ใช้ ฟังก์ชันนี้รับรหัสเซสชันจากคุกกี้ของเบราว์เซอร์ที่ส่งไปยัง API ภายในการเรียก HTTP

  • setSessionId :ฟังก์ชันนี้ตั้งค่าคุกกี้รหัสเซสชันเป็นพารามิเตอร์รหัสเซสชันที่กำหนด

  • getSessionIdAndCreateIfMissing :ฟังก์ชันนี้เรียก 18 เพื่อรับรหัสเซสชันที่มีอยู่จากคุกกี้และตั้งค่า UUID แบบสุ่มใหม่เป็นรหัสเซสชันใหม่ เว้นแต่จะมีรหัสเซสชันในเบราว์เซอร์ของผู้ใช้อยู่แล้ว ฟังก์ชันนี้ยังเพิ่ม ID เซสชันใหม่ให้กับคุกกี้เพื่อส่งกลับไปยังเบราว์เซอร์

  • getSessionData :เราจะเรียกใช้ฟังก์ชันนี้เพื่อรับข้อมูลเซสชันจาก Redis มันจะรับข้อมูลเซสชันของคีย์ที่กำหนดจาก Upstash Redis และส่งคืน

  • getAllSessionData :ฟังก์ชันนี้รับข้อมูลเซสชันทั้งหมด โดยรับคู่คีย์-ค่าทั้งหมดของแฮชเซสชันจาก Upstash Redis

  • setSessionData :เราจะตั้งค่าคู่คีย์-ค่าของเซสชันที่กำหนดในฟังก์ชันนี้

เนื่องจากฟังก์ชันยูทิลิตี้เพื่อจัดการ ID เซสชันและพื้นที่เก็บข้อมูลเซสชันผ่าน Upstash Redis ตอนนี้เราจึงสามารถใช้ API ที่ใช้ฟังก์ชันเหล่านี้ได้

API จะเรียบง่ายมาก มันจะได้รับชื่อผู้ใช้จากเส้นทาง เมื่อได้รับคำขอแล้ว จะตรวจสอบก่อนว่ามีรหัสเซสชันอยู่ในคุกกี้หรือไม่ หากไม่มีรหัสเซสชันในคุกกี้ มันจะสร้างรหัสใหม่และตั้งค่าไว้ในคุกกี้ในการตอบกลับ หากมี ID เซสชันอยู่ ระบบจะตรวจสอบว่ามีคีย์ใน Upstash Redis ในแฮชที่แสดงถึงเซสชันหรือไม่ หากไม่มี มันจะสร้างคู่คีย์-ค่าในแฮชนั้น

มาเขียนโค้ดกันดีกว่า!

API จะถูกสร้างขึ้นโดยใช้เราเตอร์แอปของ Nextjs

เราควรสร้างไฟล์ภายใต้ 28 [ชื่อผู้ใช้]35 เส้นทาง.tsx`.

 import * as sessionStore from '../../lib/session'
 
 export async function GET(request: Request,{ params }: { params: Promise<{ user: string }> }){
 const userName = (await params).user;
 const sessionId = await sessionStore.getSessionIdAndCreateIfMissing();
 const sessionStatus = await sessionStore.get('sessionStatus', userName);
 if(sessionStatus == null) {
 console.log('There is no active session.');
 await sessionStore.set('sessionStatus', 'ACTIVE', userName);
 }
 return Response.json({ userName: userName, sessionId: sessionId });
}
 

ไฟล์เส้นทางนี้จะอนุญาตให้ Nextjs แก้ไขคำขอที่ส่งไปยัง 43 ไปยังวิธี HTTP ที่กำหนดไว้ภายในตัวมันเอง

ตอนนี้เราจะเห็นมันในการดำเนินการ มาเรียกใช้แอป Nextjs โดยไปที่ไดเร็กทอรีรากจากเทอร์มินัลแล้วรันคำสั่งต่อไปนี้:

npm run dev

ตอนนี้เราสามารถเปิดตำแหน่งข้อมูล API ได้ 58 บนเบราว์เซอร์ เมื่อคุณเปิดมัน คุณจะเห็นชื่อผู้ใช้และรหัสเซสชันที่ส่งคืน:

{"userName":"noah","sessionId":"804814dc-10fc-4b0a-a4c1-321f4b54d399"}

หากคุณคลิกขวาและตรวจสอบ คุณจะเห็น session-id ที่ตั้งค่าไว้ในคุกกี้โดยไปที่แท็บ “แอปพลิเคชัน”

การจัดการเซสชันที่ปลอดภัยใน Next.js โดยใช้ Upstash Redis

นอกจากนี้เรายังสามารถตรวจสอบ Upstash Redis ได้ว่าเซสชันนั้นถูกสร้างขึ้นในฐานข้อมูลหรือไม่ ในการตรวจสอบ เราควรกลับไปที่คอนโซล Upstash Redis เปิดฐานข้อมูล Redis และเปิด 62 แท็บ

75 แท็บจะแสดงข้อมูลเซสชันดังที่แสดงด้านล่าง

การจัดการเซสชันที่ปลอดภัยใน Next.js โดยใช้ Upstash Redis

บทสรุป

การจัดการเซสชันในแอป Next.js ด้วย Upstash Redis นำเสนอโซลูชันที่ปรับขนาดได้และมีประสิทธิภาพ ในบล็อกโพสต์นี้ เราได้สร้างแอป Nextjs และรวมเข้ากับ Upstash Redis เพื่อใช้เป็นที่เก็บข้อมูลการจัดการเซสชัน

ด้วยการตั้งค่าฐานข้อมูล Redis และผสานรวมเข้ากับ Next.js ได้อย่างราบรื่น คุณสามารถจัดการพื้นที่จัดเก็บเซสชันได้อย่างมีประสิทธิภาพโดยไม่เกิดความยุ่งยากทางฝั่งเซิร์ฟเวอร์แบบเดิมๆ แนวทางนี้เหมาะสำหรับนักพัฒนาที่กำลังมองหาประสิทธิภาพและความเรียบง่ายในการจัดการเซสชัน

หวังว่าคู่มือนี้จะให้แนวทางที่ชัดเจนในการใช้ Upstash Redis เป็นที่เก็บเซสชันที่เชื่อถือได้ในแอปพลิเคชัน Next.js ของคุณ