219. 單頁應用 會話管理(session、cookie、jwt)

原文鏈接:https://github.com/ly525/blog...

關鍵字:http-only, cookie,sessionid, vue-router, react-router, 安全localStorage, jwt

需求描述

  1. 內部管理平臺,需要用戶登錄之后才能訪問。現在將 該平臺地址(www.xxx.com/home) 直接發給新來的運營同學
  2. 前端需要檢測該用戶是否已登錄,如果未登錄,則將其 redirect 到登錄頁面
  3. 因為該頁面為單頁應用,路由跳轉不涉及后端的 302 跳轉,使用前端路由跳轉

實現思路

實現代碼

// 以 vue-router 為例
// 登錄中間驗證,頁面需要登錄而沒有登錄的情況直接跳轉登錄
router.beforeEach((to, from, next) => {const hasToken = document.cookie.includes('sessionid');// 如果采用 jwt,則同樣 hasToken = localStorage.jwtconst pathNeedAuth = to.matched.some(record => record.meta.requiresAuth);// 用戶本地沒有后端返回的 cookie 數據 && 前往的頁面需要權限// if (pathNeedAuth && !hasToken ) {next({path: '/login',query: { redirect: to.fullPath },});} else if (hasToken && to.name === 'login') {// 已登錄 && 前往登錄頁面, 則不被允許,會重定向到首頁next({path: '/',});} else {next();}
});
  1. 應該在進入任何頁面之前,判斷:

    1. 該頁面是否需要權限才能訪問:登錄、注冊頁面不需要權限
    2. 用戶是否已經登錄:本地 cookie (或者 localStorage)包含 session 相關信息

       Cookie: csrftoken=YaHb...; sessionid=v40ld3x....
  2. 如果 A頁面需要權限本地 cookie中包含了 sessionid 字段,則允許訪問A頁面,否則跳轉到登錄頁面

    1. 備注:sessionid 該字段由用戶在登錄之后,由后端框架通過 response.setCookie 寫入前端 ,因此該字段需要和后端同學確認
    2. 需要后端同學在 response header 中配置cookie中該字段的 http-only屬性,允許前端讀取 cookie。否則前端通過 document.cookie 讀取到的 cookie 將不包含 sessionid 字段
    3. 這個時候,可能會存在 js 讀取cookie 導致不安全的情況,后端同學可以把 cookie 中的某個字段設置為 允許讀取,其他 cookie 設置不允許讀取,這樣即使被第三方不安全腳本獲取,也無法產生負面影響。
  3. 如果用戶已登錄 && 在瀏覽器中輸入了登錄頁地址,則將其重定向到首頁

更多說明

  1. 這樣做,前端就不必再向后端發起 API 做權限鑒定了(后端返回401,前端跳轉到 401),減少不必要的API 請求,特別是如果在API響應時間過長的情況下,體驗不太友好。
  2. 用戶修改 cookie,偽造 sessionid

    1. 這樣的話,前端就無能為力了,前端鑒權此時認為該用戶合法。此時訪問首頁,將會調用獲取數據的API。
    2. 瀏覽器會將 用戶偽造的 sessionid 帶給后端,這時候就需要后端對 sessionid 進行較驗了。比如校驗前端帶來的 sessionid 與數據庫中的 sessionid 是否一致
    3. 用戶偽造的數據 sessionid 和 后端數據庫中 sessionid 的概率 非常非常低,可以忽略不計,因為 sessionid 的位數一般在 32 位以上,因為里面包含了字母和數字,也就由 32 ^ 36 種可能
    4. 結論:偽造沒有意義,即使用戶可以看到頁面的樣子,但是看不到數據
  3. 采用 localStorage 而不是 sessionStorage 的原因(SessionStorage 失效場景)

    原因:sessionStorage 無法跨 Tab 共享
    1. 用戶在新打開一個 Tab,輸入已經登錄之后的某個頁面
    2. 通過target="_blank" 來打開新頁面的時候,會導致會話失效
    3. 在當前頁面執行 Duplicate (復制 Tab),sessionStorage 失效

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

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

相關文章

(原+譯)使用numpy.savez保存字典后讀取的問題

轉載請注明出處: http://www.cnblogs.com/darkknightzh/p/7608928.html 參考網址; https://stackoverflow.com/questions/22315595/saving-dictionary-of-header-information-using-numpy-savez python中,使用pickle保存變量時,如果變量過大&…

NLog 通過http保存日志

簡介NLog是一個基于.NET平臺編寫的類庫,我們可以使用NLog在應用程序中添加極為完善的跟蹤調試代碼。 NLog是一個簡單靈活的.NET日志記錄類庫。通過使用NLog,我們可以在任何一種.NET語言中輸出帶有上下文的(contextual information&#xff09…

嵌套映射

1. 多對一嵌套查詢映射使用案例 package com.zixue.dao;import com.zixue.annotation.MyBatisRepository; import com.zixue.entity.Emp;/*** 員工表的DAO組件* */ MyBatisRepository public interface EmpDao {void save(Emp emp);Emp findById(int id);Emp findById2(int id)…

gopro dataset_如何將GoPro安裝到DSLR相機

gopro datasetIf you have a DSLR camera with a hot shoe, it’s easy to attach various flashes and other accessories right to your camera. But with a couple of cheap attachments on hand, you can mount your GoPro to your DSLR camera as well. 如果您的DSLR相機帶…

音頻 m4a 轉 wav

背景最近做智能家居,需要用到一些應答詞 需要自己錄制。但是在mac下面通過 QuickTime 錄制的是 m4a格式。但是應答詞需要 wav格式。所以就需要轉化了解決方法# sox 不行, ffmpeg 很麻煩,用 avconv 很簡單。安裝 如果沒有就安裝 # apt-get ins…

jQuery已經過時了,還需要學嗎?

說起jQuery,很多剛參加工作的程序員都沒用過,甚至沒聽過。曾幾何時jQuery可是秒殺一切Js庫,大有一統江山的情況,可是在頂峰的時候,瞬間被Vue、React、Angela三大框架斬于馬下。從百度指數,我們也看出在2015…

Bootstrap01

Bootstrap01內容概要 一.使用Bootstrap的步驟 1.下載Bootstrap類庫,包含三個部分,fonts,css,Bootstrap 2.導入項目中,在頭部引入JQ,css和Bootstrap 注意:JQ要引入在Bootstrap前面! 3.使用css樣式時,全部使用class屬性 二.全局CSS概要 1.僅支持H5文檔格式 2.移動設備優先,需要在…

ios raise_如何在iOS 10中關閉“ Raise to Wake”

ios raiseRaise to Wake is a new Lock screen feature available in iOS 10. It allows you to wake your phone’s screen simply by picking up your phone. This feature is on by default, but if you’d rather not use it, it’s simple to turn off. “喚醒”是iOS 10中…

資源調度器調研

2019獨角獸企業重金招聘Python工程師標準>>> 場景描述: 異步觸發和Crontab觸發 YARN(Yet Another Resource Negotiator)Hadoop 資源管理器 主要構成: RM(ResourceManager)是一個全局的資源管理器,負責整個系統的資源管理和分配。…

WPF-19 IValueConverter接口

我們先來看看微軟官方給出的定語:提供將自定義邏輯應用于綁定的方法,我們來看一下該接口的定義,Convert提供了將數據源到UI的格式化,ConvertBack表示反向namespace System.Windows.Data {//// Summary:// Provides a way to a…

JVM學習記錄-類加載的過程

類的整個生命周期的7個階段是:加載(Loading)、驗證(Verification)、準備(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)、卸載(Unloading)。 類加載的全過程主要包括:加載、驗證、準備、解析、初始化這5個…

使用 Azure CLI 將 IaaS 資源從經典部署模型遷移到 Azure Resource Manager 部署模型

以下步驟演示如何使用 Azure 命令行接口 (CLI) 命令將基礎結構即服務 (IaaS) 資源從經典部署模型遷移到 Azure Resource Manager 部署模型。 本文中的操作需要 Azure CLI。 Note 此處描述的所有操作都是冪等的。 如果你遇到功能不受支持或配置錯誤以外的問題,建議你…

c++的進制轉換函數

https://blog.csdn.net/u010003835/article/details/47665847https://blog.csdn.net/vir_lee/article/details/80645066strtol函數:用于由十進制轉化到2~36的其他進制。函數原型為:long int strtol(const char *nptr,char **endptr,int base); 還應該注意…

黑蘋果不能imessage_如何修復iMessage在iOS 10中不顯示消息效果

黑蘋果不能imessageiMessage got a huge update in iOS 10, adding things like third-party app integration, rich links, and a number of fun graphical effects for messages. If you’re seeing messages that say something like “(sent with Invisible Ink)” instead…

MyBatisPlus怎么忽略映射字段

TableField(exist false):表示該屬性不為數據庫表字段,但又是必須使用的。 TableField(exist true):表示該屬性為數據庫表字段。 Mybatis-Plus 插件有這個功能,可以看一下 TableName:數據庫表相關 TableId&#xff1…

從技術總監到開源社區運營:過去兩年,我都做了點啥?

這是頭哥侃碼的第267篇原創今天,這是我離開前公司的第 7 天。相信有不少吃瓜群眾都很好奇,你這些天都在干啥?是不是蓬萊樂逍遙,過上了那悠閑的神仙日子?還是趁著疫情管控逐漸放開,和家人一起去深山老林里吸…

查看模擬器使用端口_為什么我們仍然使用模擬音頻端口?

查看模擬器使用端口When leaks about what the chassis of the iPhone 7 might look like hit headlines earlier this week, technology columnists and industry analysts jumped on the chance to report that Apple’s next device may finally ditch its 3.5mm audio port…

ServletContextListener在Springboot中的使用

ServletContextListener是servlet容器中的一個API接口, 它用來監聽ServletContext的生命周期,也就是相當于用來監聽Web應用的生命周期。今天我們就來說說如何在Springboot 1.5.2這個輕量型框架中如何使用它。 其實配置ServletContextListener與其它Filter, Listener…

《ASP.NET Core 6框架揭秘》實例演示[34]:緩存整個響應內容

我們利用ASP.NET開發的大部分API都是為了對外提供資源,對于不易變化的資源內容,針對某個維度對其實施緩存可以很好地提供應用的性能。《內存緩存與分布式緩存的使用》介紹的兩種緩存框架(本地內存緩存和分布式緩存)為我們提供了簡…

常見端口介紹

Win常用端口 TCP端口(靜態端口)TCP 0 ReservedTCP 1TCP Port Service MultiplexerTCP 2DeathTCP 5Remote Job Entry,yoyoTCP 7EchoTCP 11SkunTCP 12BomberTCP 16SkunTCP 17SkunTCP 18消息傳輸協議,skunTCP 19SkunTCP 20FTP Data,Amanda TCP 2…