現(xiàn)在很多node.js項(xiàng)目都使用express來做的,不得不承認(rèn)這個(gè)框架很火熱。很多需求只需要安裝插件簡(jiǎn)單配置就可以快速應(yīng)用到項(xiàng)目中。有個(gè)問題:
如果不依賴框架,不使用第三方模塊,設(shè)計(jì)一個(gè)登陸,如何使用session和cookie,原理是什么?
本來想詳細(xì)講解一下的,想想還是算了,簡(jiǎn)單列一下登錄認(rèn)證過程中,就應(yīng)該能理解了
客戶端: 我要查看用戶資料
服務(wù)端: 你沒有憑證(cookie),請(qǐng)先獲得憑證再來,獲得憑證需要你提供用戶名密碼。
客戶端: 好的,這是我的用戶名和密碼
服務(wù)端: 驗(yàn)證通過,現(xiàn)在為你生成憑證,請(qǐng)保管好,以后只認(rèn)憑證,就算阿貓阿狗拿著你的憑證來查資料,我也會(huì)給他。
。。。
客戶端:我要查用戶資料,這是我的憑證.
服務(wù)端:好的,請(qǐng)稍等,我確認(rèn)一下你的憑證是否真的,OK,是真的,資料拿去。
。。。
客戶端:我要查用戶資料,這是我的憑證.
服務(wù)端:對(duì)不起,你的憑證已經(jīng)過期失效了,請(qǐng)重新提供用戶名密碼獲得新的憑證。
OK,再來講一下怎么生成憑證和怎么驗(yàn)證憑證:
生成的條件是驗(yàn)證用戶提供的用戶名和密碼是對(duì)的,
a. 生成隨機(jī)唯一的session_id, 比如md5(用戶id+毫秒數(shù))
b. 生成session內(nèi)容,并建立session_id與session內(nèi)容的對(duì)應(yīng)關(guān)系
即服務(wù)端拿一本帳本,記錄下這個(gè)憑證(根椐標(biāo)識(shí))對(duì)應(yīng)的用戶名(一般是用戶ID)是誰,類似:
abcd123 => 'Tim',
ee22343 => 'You'
(這個(gè)對(duì)應(yīng)關(guān)系,可以保存在文件、memcache、數(shù)據(jù)庫等等,這就是用不同介質(zhì)保存session的原理)
c. 將session_id加密、簽名,寫到憑證中,返回客戶端。
用通俗語言來描述這個(gè)過程就是:
驗(yàn)證用戶名密碼正確后
服務(wù)端拿出一張紙,隨機(jī)寫上一個(gè)標(biāo)識(shí)(比如像醫(yī)生寫病歷,有一定的防偽性) ---- session_id
再拿出帳本,寫上這個(gè)“標(biāo)識(shí)”與“用戶”的關(guān)聯(lián),表示這個(gè)標(biāo)識(shí)就等同于用戶A ----session_id與session內(nèi)容關(guān)聯(lián)
給這張紙蓋上大印 ----session_id加密和防偽
將這張紙作為憑證,交給用戶 ---- 將加密后的session_id作為cookie返回。
最后,用戶下次來請(qǐng)求,帶上了憑證,服務(wù)端驗(yàn)證過程:
其它:
憑證有效期:比如可以約定,一天后就沒有用了
帳本有效期:session也是可以有效期的,比如我每隔一小時(shí)就刪除一些沒有用到的session,清理之后,就算你的憑證是真實(shí)的,但也無效了。
最后,cookie是標(biāo)準(zhǔn)實(shí)現(xiàn),無所謂自己實(shí)現(xiàn)(你可能只是需要封裝操作指令),要自己實(shí)現(xiàn)session的話,無非就是解決這幾個(gè)問題:
1)決定你的帳本(用什么方式保存)
2) 實(shí)現(xiàn)寫帳本(根據(jù)session_id寫數(shù)據(jù))
3) 實(shí)現(xiàn)讀帳本(按session_id讀數(shù)據(jù))
4) 實(shí)現(xiàn)清理帳本過期數(shù)據(jù)
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機(jī)構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國成功上市,融資1
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。