原文連接: https://github.com/ly525/blog...
關鍵字:http-only
, cookie
,sessionid
, vue-router
, react-router
, 安全
,localStorage
, jwt
前端
實現代碼vue
// 以 vue-router 爲例 // 登陸中間驗證,頁面須要登陸而沒有登陸的狀況直接跳轉登陸 router.beforeEach((to, from, next) => { const hasToken = document.cookie.includes('sessionid'); // 若是採用 jwt,則一樣 hasToken = localStorage.jwt const 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(); } });
應該在進入任何頁面以前,判斷:react
用戶是否已經登陸:本地 cookie (或者 localStorage)包含 session 相關信息git
Cookie: csrftoken=YaHb...; sessionid=v40ld3x....
若是 A頁面須要權限
且 本地 cookie中包含了 sessionid 字段
,則容許訪問A頁面,不然跳轉到登陸頁面github
response.setCookie
寫入前端 ,所以該字段須要和後端同窗確認用戶已登陸
&& 在瀏覽器中輸入了登陸頁
地址,則將其重定向到首頁
用戶修改 cookie,僞造 sessionidvue-router
用戶僞造的 sessionid
帶給後端,這時候就須要後端對 sessionid 進行較驗了。好比校驗前端帶來的 sessionid 與數據庫中的 sessionid 是否一致採用 localStorage 而不是 sessionStorage 的緣由(SessionStorage 失效場景)數據庫
緣由:sessionStorage 沒法跨 Tab 共享
target="_blank"
來打開新頁面的時候,會致使會話失效Duplicate
(複製 Tab),sessionStorage 失效