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