用戶登錄權限

文章目錄

    • @[TOC](文章目錄)
  • 前言
  • 一、 Cookie與session
    • 1.HTTP無狀態
    • 2.cookie 和 session 的生命周期
      • 2.1 cookie 生命周期影響因素
      • 2.2 session 生命周期影響因素
    • 3.cookie 和 session 的區別
    • 4.工作原理
    • 3 用戶登錄Node.js和Express驗證session
  • 二、JSON Web Token
    • 1. JWT 介紹
    • 2. JWT 組成部分
    • 3.JWT 的原理
    • 4.用戶登錄Node.js和Express驗證JWT

前言

本文記錄了用戶登錄的兩種鑒權方式,以及相關知識點的記錄。


一、 Cookie與session

  • cookie和session是來實現狀態的記錄,都是由服務器生成,用來存儲特定的值。
  • 一般情況下,在服務器端,session的存儲方式:文件方式、數據庫方式,用 sessionId 來識別。
  • 客戶端(瀏覽器)在發送請求的時候,會自動將存活、可用的cookie封裝在請求頭(headers)中和請求一起發送。

1.HTTP無狀態

  • HTTP 協議是無狀態的,無狀態意味著,服務器無法給不同的客戶端響應不同的信息。這樣一些交互業務就無法支撐。

2.cookie 和 session 的生命周期

2.1 cookie 生命周期影響因素

  • cookie自身的存活時間:是服務器生成cookie時去設定的。
  • 客戶端是否保留cookie。對客戶端自身有影響,對其它封包工具無影響。

2.2 session 生命周期影響因素

  • 服務器對于session對象保存的最大時間設置。
  • 客戶端進程是否關閉。對客戶端自身有影響,對其它封包工具無影響。

3.cookie 和 session 的區別

  • 存儲位置:cookie 是存在客戶端,session是存在服務端。
  • 安全性:session 比 cookie 更安全。
  • 存儲內容:Session中存儲的是對象,而Cookie中存儲的是字符串。
  • 保持時間:Session隨會話結束而關閉,而Cookie可以長期保存在客戶端,除非被設置過期或者被刪除。
  • 對服務器壓力:每個用戶都會產生一個session,如果并發訪問的用戶過多,就會產生非常多的session,耗費大量的內存。

為什么session 比 cookie 更安全?

  • cookie 是存儲在客戶端的,可見、可改變。
  • session 存儲在服務器端,不可見,不可改變。

4.工作原理

1、用戶向服務器發送用戶名和密碼。
2、服務器驗證通過后,在當前對話(session)里面保存相關數據,比如用戶角色、登錄時間等等。
3、服務器向用戶返回一個 session_id,寫入用戶的 Cookie。
4、用戶隨后的每一次請求,都會通過 Cookie,將 session_id 傳回服務器。
5、服務器收到 session_id,找到前期保存的數據,由此得知用戶的身份。

在這里插入圖片描述

3 用戶登錄Node.js和Express驗證session

  • express 引入會自動生成加密的 sessionId, 然后校驗session
const express = require("express");
const session = requrie("express-session");
const MongoStore = require("connect-mongo")
const app = express();
//注冊session
app.use(session({secret:"this is session",//服務器生成sessionresave:true,saveUninitialized:true,//強制將初始化的session 存儲cookie:{maxAge:100 * 60 * 10, //過期時間secure:false, //為true的時候只有 https 協議才能訪問cookie},rolling:true, //true:超時前刷新,cookie會重新計時//false:超時前刷新多次,按第一次刷新計時store:MongoStore.create({mongoUrl:'mongodb://127.0.0.1:27017/vv_session',ttl: 1000 * 60 * 10, //過期時間}),})
);
//設置session
app.use((req,res,next)=>{if(req.url === "/login"){next()return;}if(req.session.user){req.session.garbage = Date();next();}else{res.redirect("/login")}
})
//注銷session

二、JSON Web Token

1. JWT 介紹

  • JSON Web Token(JWT),又稱為JSON令牌,是一種用于在網絡應用之間安全地傳輸信息的開放標準(RFC 7519)。它采用了一種緊湊的、自包含的方式來表示信息,通常用于身份驗證和授權。JWT的設計目標是確保信息的完整性和安全性,同時具備易于使用和傳輸的特點。

2. JWT 組成部分

  • Header (頭部):是一個 JSON 對象,通常由 token 類型和簽名算法名兩部分組成。
    { "alg": "HS256", //示簽名的算法(algorithm) "typ": "JWT" //表示這個令牌(token)的類型(type) }
  • Payload(載荷):也是一個 JSON 對象,用來存放實際需要傳遞的數據,通常會被base64url編碼

JWT 規定了7個官方字段

  • iss (issuer):簽發人
  • exp (expiration time):過期時間
  • sub (subject):主題
  • aud (audience):受眾
  • nbf (Not Before):生效時間
  • iat (Issued At):簽發時間
  • jti (JWT ID):編號
  • Signature(簽名):將Header和Payload部分組合起來,防止數據篡改。

3.JWT 的原理

  • 服務器認證以后,生成一個 JSON 對象,發回給用戶,以后在用戶與服務端通信的時候,都要發回這個 JSON 對象。服務器完全只靠這個對象認定用戶身份。為了防止用戶篡改數據,服務器在生成這個對象的時候,會加上簽名。
    在這里插入圖片描述

4.用戶登錄Node.js和Express驗證JWT

const express = require('express');
const jwt = require('jsonwebtoken');const app = express();
const secretKey = 'your-secret-key';// 中間件:驗證JWT
const verifyToken = (req, res, next) => {const token = req.headers.authorization;if (!token) {return res.status(401).json({ message: '無法驗證身份' });}jwt.verify(token, secretKey, (err, decoded) => {if (err) {return res.status(401).json({ message: '身份驗證失敗' });}req.user = decoded;next();});
};// 路由:受保護的資源
app.get('/protected', verifyToken, (req, res) => {res.json({ message: '歡迎訪問受保護的資源', user: req.user });
});// 路由:生成JWT
app.post('/login', (req, res) => {const user = { id: 1, username: 'user123' };const token = jwt.sign(user, secretKey, { expiresIn: '1h' });res.json({ token });
});app.listen(3000, () => {console.log('服務器運行在端口 3000');
});

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/213469.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/213469.shtml
英文地址,請注明出處:http://en.pswp.cn/news/213469.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C#使用Matrix類對Dicom圖像的放縮

C#使用Matrix類對Dicom圖像的放縮,使用Matrix 1.同時操作水平、垂直同時放縮 // 創建一個 Matrix 對象 Matrix m_Matrix new Matrix();//放縮參數 float inputZoom1.2f; m_Matrix.Scale(inputZoom, inputZoom, MatrixOrder.Append); 2.操作水平(X軸…

前端使用插件預覽pdf、docx、xlsx、pptx格式文件

PDF預覽 H5頁面pdf預覽 插件:pdfh5 版本:“pdfh5”: “^1.4.7” npm install pdfh5 import PdfH5 from "pdfh5"; import "pdfh5/css/pdfh5.css";// methods this.$nextTick(() > {this.pdfH5 new PdfH5("#pdf", {pd…

【算法系列篇】遞歸、搜索和回溯(二)

文章目錄 前言1. 兩兩交換鏈表中的節點1.1 題目要求1.2 做題思路1.3 代碼實現 2. Pow(X,N)2.1 題目要求2.2 做題思路2.3 代碼實現 3. 計算布爾二叉樹的值3.1 題目要求3.2 做題思路3.3 代碼實現 4. 求根節點到葉結點數字之和4.1 題目要求4.2 做題思路4.3 代碼實現 前言 前面為大…

計算機畢業設計springboot+ssm停車場車位預約系統java

管理員不可以注冊賬號 停車位包括車位所在樓層、車位編號、車位類型(全時間開放/高峰期開放)、預定狀態等 用戶預約時要求支付預約時間段的停車費用 違規行為:1.停車超過預約時間段 2.預約未使用 于系統的基本要求 (1)功能要求&am…

6G來襲,真的有必要嗎?

6G來襲,6G標準將在2025年完成制定,2030年商用。當5G都還沒玩明白的時候,6G又來了。 這次6G又提出了三個全新高大上場景,感知通信、人工智能通信、天地一體泛在物聯,精英們還說,未來要連接很多機器人、元宇宙…

PHP基礎 - 循環與條件語句

循環語句 1)for循環: 重復執行一個代碼塊指定的次數。 for ($i = 0; $i < 5; $i++) { // 初始化 $i 為 0,每次循環后將 $i 值增加 1,當 $i 小于 5 時執行循環echo "The number is: $i \n"; // 輸出當前 $i 的值并換行 }// 循環輸出結果為: // The number …

mysql字段設計規范:使用unsigned(無符號的)存儲非負值

如果一個字段存儲的是數值&#xff0c;并且是非負數&#xff0c;要設置為unsigned&#xff08;無符號的&#xff09;。 例如&#xff1a; 備注&#xff1a;對于類型是 FLOAT、 DOUBLE和 DECIMAL的&#xff0c;UNSIGNED屬性已經廢棄了&#xff0c;可能在mysql的未來某個版本去…

mysql分別在windows和linux下的備份策略

嗟乎&#xff01; 一、概述 mysql數據庫該怎么備份呢&#xff1f; 數據庫備份有幾個概念&#xff1a;全量備份、增量備份、差異備份。當然啦&#xff0c;數據庫備份又有冷備份和熱備份&#xff0c;即物理備份和邏輯備份之分。冷備份就是將mysql停了&#xff0c;然后直接拷貝…

Python入門第2篇

pip包管理器 包管理器類似.NET下的nuget&#xff0c;主要用于管理引用依賴項。 安裝Python的時候&#xff0c;已經默認安裝了pip包管理器&#xff0c;因此無需單獨安裝 cmd&#xff0c;輸入&#xff1a;pip --version 顯示pip版本號信息&#xff0c;即代表pip安裝成功&…

前端知識筆記(四十二)———http和https詳細解析

HTTP&#xff08;Hypertext Transfer Protocol&#xff09;是一種用于在計算機網絡中傳輸超文本的協議。它是一個客戶端-服務器協議&#xff0c;用于從 Web 服務器傳輸超文本到本地瀏覽器。HTTP 使用 TCP/IP 協議作為底層傳輸協議&#xff0c;并使用默認端口號80。 HTTPS&…

8-tornado中模板的使用(通過字符串返回、通過模板Template返回、通過模板render返回)、模板案例

1 Template 1.1 通過字符串返回 import tornado class IndexHandler(web.RequestHandler):def get(self):arg Templateself.finish(f<h1>Hello {arg}!!</h1>)1.2 通過模板Template返回 tornado.template 一個簡單的模板系統&#xff0c;將模板編譯為Python代碼。…

c 一,二,三維數組的定義和賦值

1. 定義數組必須指定數組的大小&#xff0c;也就是用多少存儲空間來存儲此數組 2.定義數組必須用數組的標準格式定義&#xff1a;數組名下標的形式 3.只有字符串可以用指針來定義 4.可以把c 中一切數和struct 理解為char 數組 比如int 就是4字節的char數組 #include <…

編程語言的演進歷程與未來發展趨勢

第一代 編程語言的發展歷程起源于早期的機器語言階段&#xff0c;這是一種由二進制代碼構成的計算機能夠直接解讀并執行的語言。然而&#xff0c;鑒于其過于復雜且難以理解&#xff0c;故這一時代的語言并不常為人類所采納。 第二代 緊接著產生的第二代語言旨在簡化編程過程…

1001 害死人不償命的(3n+1)猜想

卡拉茲(Callatz)猜想&#xff1a; 對任何一個正整數 n&#xff0c;如果它是偶數&#xff0c;那么把它砍掉一半&#xff1b;如果它是奇數&#xff0c;那么把 (3n1) 砍掉一半。這樣一直反復砍下去&#xff0c;最后一定在某一步得到 n1。卡拉茲在 1950 年的世界數學家大會上公布了…

C++ //習題2.5 請寫出下列表達式的值。

C程序設計 &#xff08;第三版&#xff09; 譚浩強 習題2.5 習題2.5 請寫出下列表達式的值。 (1) 3.5 * 3 2 * 7 - ‘a’ (2) 26 / 3 34 % 3 2.5 (3) 45 / 2 (int)3.14159 / 2 (4) a b (c a 6) 設a的初值為3 (5) a 3 * 5, a b 3 * 2 (6) (int)(a 6.5) % 2 …

UI自動化測試工具的定義及重要性

UI自動化測試工具在現代軟件開發中起著不可或缺的作用。它們能夠提高測試效率、減少人為錯誤、提供全面的測試覆蓋&#xff0c;并支持持續集成。通過有效使用UI自動化測試工具&#xff0c;開發團隊可以提高軟件質量&#xff0c;提供更可靠的應用程序&#xff0c;滿足用戶的需求…

C語言之數組精講(2)

目錄 數組的復制 輸入數組元素的值 對數組的元素進行倒序排列 使用數組進行成績處理 對象式宏 數組元素的最大值和最小值 賦值表達式的判斷 數組的元素個數 結語 數組的復制 我們把數組中的元素全部復制到另一個數組中。 #include<stdio.h>int main() {int i;int…

SwinIR: Image Restoration Using Swin Transformer

SwinIR 簡介 論文地址&#xff1a;SwinIR: Image Restoration Using Swin Transformer 代碼&#xff1a;SwinIR ? 本文提出了一個基于swin transformer的圖像超分模型swinIR。其中SwinIR分為三部分&#xff1a;淺層特征提取、深層特征提取和高質量圖像重建模塊。 現階段問…

WordPress如何通過header給頁面發送原生HTTP頭

在WordPress中&#xff0c;你可以使用header() 函數來發送原生HTTP頭。這個函數通常在主題文件&#xff08;例如header.php&#xff09;或者插件中使用。以下是一個簡單的例子&#xff0c;演示如何在WordPress中使用header() 函數發送原生HTTP頭&#xff1a; <?php // 在主…

19.java程序設計-基于SpringBoot的博客管理系統的設計與實現

摘要 隨著信息技術的迅速發展&#xff0c;博客作為一種重要的信息傳播和交流工具&#xff0c;逐漸在互聯網上占據重要地位。為了滿足用戶對個性化博客管理的需求&#xff0c;本研究設計并實現了一種基于Spring Boot框架的博客管理系統。 本系統通過采用前后端分離的架構&…