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