來(lái)源:北大青鳥(niǎo)總部 2023年07月10日 14:33
這是一個(gè)最好的時(shí)代,我們的衣食住行、吃喝玩樂(lè),通過(guò)一個(gè)手機(jī)就可以完成。比如我們想去吃個(gè)飯,那么只需要打開(kāi)美團(tuán)APP,搜索哪個(gè)餐廳的飯菜最好吃,再使用滴滴APP叫個(gè)車直接從家門(mén)口送到餐廳,到了餐廳后打開(kāi)微信APP掃描二維碼點(diǎn)餐,點(diǎn)完餐后打開(kāi)微博APP刷刷微博、抖音APP刷刷視頻、微信APP聊聊天、淘寶APP購(gòu)購(gòu)物,等待美食的到來(lái),飯菜上桌后使用美圖秀秀APP先拍個(gè)照、錄視頻發(fā)發(fā)朋友圈,開(kāi)吃,吃完飯后使用支付寶或微信掃碼付款,再使用滴滴叫個(gè)車回家。全程你只需要帶一個(gè)手機(jī)就好,有了手機(jī)一切都可以搞定,噢,也許你還要帶個(gè)充電寶,做好彈藥支撐。毫無(wú)疑問(wèn),在今天,我們?cè)僖搽x不開(kāi)手機(jī)了。
在我們使用手機(jī)上網(wǎng)時(shí),所有的內(nèi)容都是以我為中心來(lái)觸發(fā)的,美團(tuán)app是我的賬號(hào)在登陸,記錄的是我相關(guān)的信息,同理其它的APP也是個(gè)人賬號(hào)登陸,在Web端使用瀏覽器進(jìn)行工作時(shí)也是以個(gè)人賬號(hào)登陸完成的。因此可以說(shuō)在所有互聯(lián)網(wǎng)應(yīng)用中,個(gè)人相關(guān)的信息非常重要,個(gè)人信息相關(guān)技術(shù)的實(shí)現(xiàn)也非常重要,它是一切的根源,就像氧氣一樣,不能沒(méi)有它。所以作為一個(gè)互聯(lián)網(wǎng)從業(yè)者,無(wú)論是產(chǎn)品經(jīng)理、開(kāi)發(fā)人員,還是測(cè)試人員、運(yùn)維人員,了解相關(guān)技術(shù)實(shí)現(xiàn)都是必須的。如果用三個(gè)詞來(lái)概括的話,那便是Cookie、Session、Token。
Cookie是瀏覽器存儲(chǔ)的一段文本信息,用于客戶端和服務(wù)器進(jìn)行交互。我們現(xiàn)在所使用的在線服務(wù),都是通過(guò)HTTP協(xié)議進(jìn)行交互的,客戶端通過(guò)HTTP協(xié)議發(fā)送請(qǐng)求給到服務(wù)端,服務(wù)端計(jì)算查詢獲取結(jié)果再返回給客戶端。早期的在線網(wǎng)絡(luò)服務(wù)很簡(jiǎn)單,每次請(qǐng)求通過(guò)HTTP發(fā)起,服務(wù)端返回就好,那會(huì)兒上網(wǎng)也貴,上網(wǎng)的人也少,大家對(duì)于網(wǎng)絡(luò)服務(wù)沒(méi)啥要求。慢慢的隨著互聯(lián)網(wǎng)和移動(dòng)通信網(wǎng)絡(luò)的發(fā)展,上網(wǎng)開(kāi)始變得便宜起來(lái),上網(wǎng)的人也變得多了起來(lái)。大家開(kāi)始對(duì)互聯(lián)網(wǎng)有了一些要求,比如不再希望每次上網(wǎng)時(shí)都登陸個(gè)人信息,因?yàn)橛涀∽约旱挠脩裘兔艽a是一件非常麻煩的事情,甚至記錄瀏覽網(wǎng)站的地址也很麻煩。這時(shí)候通過(guò)Cookie技術(shù),服務(wù)端可以給用戶發(fā)放屬于個(gè)人的唯一標(biāo)識(shí)符,通過(guò)HTTP協(xié)議傳遞給客戶端,客戶端可以瀏覽器通過(guò)Cookie緩存服務(wù)端發(fā)送給客戶端的個(gè)人唯一標(biāo)識(shí),此后每次只要是該用戶訪問(wèn)時(shí),就在HTTP請(qǐng)求中帶上Cookie,就可以不用再登陸了,系統(tǒng)自動(dòng)填充用戶名和密碼。打開(kāi)瀏覽器時(shí),其實(shí)也本機(jī)是在使用瀏覽器這個(gè)產(chǎn)品,因此也會(huì)存儲(chǔ)該臺(tái)電腦的歷史記錄,我們就可以看到最近訪問(wèn)的網(wǎng)絡(luò)鏈接,再也不用記住復(fù)雜的網(wǎng)址了。
在Cookie中緩存的個(gè)人唯一標(biāo)識(shí),就是SessionID??蛻舳撕蜑g覽器的每一次會(huì)話就是一次Session,每個(gè)用戶一個(gè)SessionID。在用戶通過(guò)客戶端和服務(wù)器進(jìn)行交互時(shí),通過(guò)HTTP請(qǐng)求發(fā)送用戶名和密碼,服務(wù)器驗(yàn)證通過(guò)后,在當(dāng)前會(huì)話中保存相關(guān)數(shù)據(jù),并且返回一個(gè)SessionID,通過(guò)Set-Cookie寫(xiě)入該用戶的Cookie。自此,用戶每一次請(qǐng)求都會(huì)通過(guò)Cookie把SessionID傳遞給到服務(wù)端,服務(wù)端根據(jù)SessionID找到之前的數(shù)據(jù),呈現(xiàn)給到用戶。在HTML中提供三種方式保存Session,Cookie、LocalStorage、SessionStorage,關(guān)于Cookie大家比較清楚了,LocalStorage就是在客戶端中存儲(chǔ)的,永久生效,SessionStorage是在當(dāng)前會(huì)話中生效,關(guān)閉頁(yè)面或?yàn)g覽器后被清理。通過(guò)Session技術(shù)很好的實(shí)現(xiàn)了客戶端和服務(wù)器之間的交互,還有一些數(shù)據(jù)分析工具通過(guò)采集SessionID來(lái)計(jì)算用戶UV,定位單次會(huì)話上所產(chǎn)生的問(wèn)題。
Session技術(shù)雖然很好,但它也有兩個(gè)缺點(diǎn),即不安全、擴(kuò)展性差。所謂不安全指的是,在網(wǎng)絡(luò)訪問(wèn)中,如果有其它黑客或釣魚(yú)網(wǎng)站獲取到了我的SessionID,并且在自己的網(wǎng)絡(luò)請(qǐng)求中加入這個(gè)SessionID之后,就可以偽冒本人進(jìn)行交易,甚至導(dǎo)致個(gè)人信息泄漏。所謂擴(kuò)展性差指的是,SessionID是由服務(wù)器生成的,如果有多個(gè)服務(wù)器部署了服務(wù)(在分布式場(chǎng)景下非常常見(jiàn)),那就會(huì)出現(xiàn)A服務(wù)器發(fā)放的SessionID在訪問(wèn)B服務(wù)器請(qǐng)求時(shí)用不了,因?yàn)檫@個(gè)SessionID所存儲(chǔ)的信息是在服務(wù)器A上,不在服務(wù)器B上,這樣的用戶體驗(yàn)是很不好的。聰明的小伙伴可能說(shuō)那就用一臺(tái)服務(wù)器來(lái)專門(mén)存儲(chǔ)轉(zhuǎn)發(fā)Session,所有的請(qǐng)求都先和這臺(tái)服務(wù)器建立會(huì)話,再通過(guò)這個(gè)服務(wù)器轉(zhuǎn)發(fā)給其它服務(wù)器處理,這樣倒是解決了服務(wù)多機(jī)器部署的問(wèn)題,但是也帶來(lái)了單點(diǎn)問(wèn)題,這條Session服務(wù)器掛掉了就完蛋了,這樣的用戶體驗(yàn)同樣也是不好的,因此Token技術(shù)出現(xiàn)了。
基于Token的身份驗(yàn)證技術(shù)流程是這樣的,用戶在HTTP請(qǐng)求中發(fā)送用戶名和密碼,后端程序驗(yàn)證是否通過(guò),如果用戶名和密碼正確合法,則返回一個(gè)簽名的token給到客戶端,客戶端通過(guò)Cookie存儲(chǔ)token,每次發(fā)送請(qǐng)求時(shí)帶上token,服務(wù)端驗(yàn)證token正確與否再?zèng)Q定是否發(fā)放數(shù)據(jù)。在Token訪問(wèn)機(jī)制中,擴(kuò)展性很好,因?yàn)槭强蛻舳藬y帶的是一個(gè)Token,在分布式部署的服務(wù)場(chǎng)景下,任意服務(wù)器驗(yàn)證下Token是否正確就好,它也很安全,因?yàn)樵谡?qǐng)求中發(fā)送token而不是cookie,即使獲取了Cookie也沒(méi)辦法偽造用戶。
作為一個(gè)互聯(lián)網(wǎng)從業(yè)者,當(dāng)我們使用互聯(lián)網(wǎng)服務(wù)時(shí),如果訪問(wèn)不正常了,或者訪問(wèn)數(shù)據(jù)不對(duì)了,那么可以通過(guò)判斷Cookie是否失效、Cookie中是否含有對(duì)應(yīng)的SessionID或者Token做初步的判斷,在排查問(wèn)題中也首先判斷是否是個(gè)人問(wèn)題,不過(guò)切忌不要獲取別人的Cookie或SessionID來(lái)做不合適的事情。