前言
? ? ? ? ?廢話不多說赞辩,就是姐姐我在最近的兩個前后端分離的項目做接口測試,遇到了登錄驗證的問題伸辟,就是所謂的XSRF驗證問題×「剩現(xiàn)在提筆將配置方法總結(jié)到文中距误。
一簸搞、概念學習(ps:如果都知曉扁位,可以跳過該步驟,直接去二章節(jié)趁俊,因為我也是copy的哈哈哈)
1.明確概念:cookie和session
①cookie數(shù)據(jù)存放在客戶的瀏覽器上域仇,session數(shù)據(jù)放在服務器上。
②cookie不是很安全寺擂,別人可以分析存放在本地的cookie并進行cookie欺騙暇务,考慮到安全應當使用session。
③session會在一定時間內(nèi)保存在服務器上怔软。當訪問增多垦细,會比較占用你服務器的性能考慮到減輕服務器性能方面,應當使用cookie挡逼。
④單個cookie保存的數(shù)據(jù)不能超過4K括改,很多瀏覽器都限制一個站點最多保存20個cookie。
⑥所以將登錄信息家坎,個人賬戶資料等重要信息存放為session嘱能;其他不會泄露個人隱私的信息如果需要保留,可以放在cookie中虱疏。
2.Cookie
添加方式:線程組-配置元件-HTTP Cookie 管理器惹骂,如下圖:
Cookie的傳遞流程:
1.瀏覽器向某個URL發(fā)起HTTP請求(可以是任何請求,比如GET一個頁面做瞪、POST一個登錄表單对粪、DELETE某條評論、PUT某條更新等)
2.對應的服務器收到該HTTP請求装蓬,并計算應當返回給瀏覽器的HTTP響應(HTTP響應包括請求頭和請求體兩部分)
3.在響應頭加入Set-Cookie字段衩侥,它的值是要設置的Cookie。
4.瀏覽器收到來自服務器的HTTP響應矛物。
5.瀏覽器在響應頭中發(fā)現(xiàn)Set-Cookie字段茫死,就會將該字段的值保存在內(nèi)存或者硬盤中(Set-Cookie字段的值可以是很多項Cookie,每一項都可以指定過期時間Expires履羞。 默認的過期時間是用戶關閉瀏覽器時峦萎。)
6.瀏覽器下次給該服務器發(fā)送HTTP請求時, 會將服務器設置的Cookie附加在HTTP請求的頭字段Cookie中忆首。(瀏覽器可以存儲多個域名下的Cookie爱榔,但只發(fā)送當前請求的域名曾經(jīng)指定的Cookie, 這個域名也可以在Set-Cookie字段中指定)糙及。)
7.服務器收到這個HTTP請求详幽,發(fā)現(xiàn)請求頭中有Cookie字段, 便知道之前就和這個用戶打過交道了.
8.過期的Cookie會被瀏覽器刪除。
總之唇聘,服務器通過Set-Cookie響應頭字段來指示瀏覽器保存Cookie版姑, 瀏覽器通過Cookie請求頭字段來告訴服務器之前的狀態(tài)。 Cookie中包含若干個鍵值對迟郎,每個鍵值對可以設置過期時間剥险。
3.Session
添加方式:線程組-前置處理器 -HTTP URL 重寫修飾符,如下圖:
session的傳遞流程:
1.用戶提交包含用戶名和密碼的表單宪肖,發(fā)送HTTP請求表制。
2.服務器驗證用戶發(fā)來的用戶名密碼。
3.如果正確則把當前用戶名(通常是用戶對象)存儲到redis中控乾,并生成它在redis中的ID么介。這個ID稱為Session ID,通過Session ID可以從Redis中取出對應的用戶對象蜕衡, 敏感數(shù)據(jù)(比如authed=true)都存儲在這個用戶對象中夭拌。
4.設置Cookie為sessionId=xxxxxx|checksum并發(fā)送HTTP響應, 仍然為每一項Cookie都設置簽名衷咽。
5.用戶收到HTTP響應后鸽扁,便看不到任何敏感數(shù)據(jù)了。在此后的請求中發(fā)送該Cookie給服務器镶骗。
6.服務器收到此后的HTTP請求后桶现,發(fā)現(xiàn)Cookie中有SessionID,進行放篡改驗證鼎姊。
7.如果通過了驗證骡和,根據(jù)該ID從Redis中取出對應的用戶對象, 查看該對象的狀態(tài)并繼續(xù)執(zhí)行業(yè)務邏輯相寇。實現(xiàn)上述過程慰于,在Web應用中可以直接獲得當前用戶。 相當于在HTTP協(xié)議之上唤衫,通過Cookie實現(xiàn)了持久的會話婆赠。這個會話便稱為Session。
4.Token認證
1佳励、支持跨域訪問: Cookie是不允許垮域訪問的休里,這一點對Token機制是不存在的,前提是傳輸?shù)挠脩粽J證信息通過HTTP頭傳輸赃承。(垮域訪問:兩個域名之間不能跨過域名來發(fā)送請求或者請求數(shù)據(jù))
2妙黍、無狀態(tài)(也稱:服務端可擴展行):Token機制在服務端不需要存儲session信息,因為Token 自身包含了所有登錄用戶的信息瞧剖,只需要在客戶端的cookie或本地介質(zhì)存儲狀態(tài)信息.
3拭嫁、更適用CDN: 可以通過內(nèi)容分發(fā)網(wǎng)絡請求你服務端的所有資料(如:javascript可免,HTML,圖片等),而你的服務端只要提供API即可.
4做粤、去耦: 不需要綁定到一個特定的身份驗證方案浇借。Token可以在任何地方生成,只要在你的API被調(diào)用的時候驮宴,你可以進行Token生成調(diào)用即可.
5逮刨、更適用于移動應用: 當你的客戶端是一個原生平臺(iOS, Android呕缭,Windows 8等)時堵泽,Cookie是不被支持的(你需要通過Cookie容器進行處理),這時采用Token認證機制就會簡單得多恢总。
6迎罗、CSRF:因為不再依賴于Cookie,所以你就不需要考慮對CSRF(跨站請求偽造)的防范片仿。
7纹安、性能: 一次網(wǎng)絡往返時間(通過數(shù)據(jù)庫查詢session信息)總比做一次HMACSHA256計算 的Token驗證和解析要費時得多.
8、不需要為登錄頁面做特殊處理: 如果你使用Protractor 做功能測試的時候砂豌,不再需要為登錄頁面做特殊處理.
9厢岂、基于標準化:你的API可以采用標準化的 JSON Web Token (JWT). 這個標準已經(jīng)存在多個后端庫(.NET, Ruby, Java,Python, PHP)和多家公司的支持(如:Firebase,Google, Microsoft).
使用Token的方法
不是在每一次請求時提供用戶名和密碼的憑證。我們可以讓用戶通過token交換憑證(we can allow the client to exchange valid credentials for a token)阳距,這個token提供用戶訪問服務器的權(quán)限塔粒。Token通常比密碼更加長而且復雜。比如說筐摘,JWTs通常會應對長達150個字符卒茬。一旦獲得了token,在每次調(diào)用API的時候都要附加上它咖熟。然后圃酵,這仍然比直接發(fā)送賬戶和密碼更加安全,哪怕是HTTPS馍管。
把token想象成一個安全的護照郭赐。你在一個安全的前臺驗證你的身份(通過你的用戶名和密碼),如果你成功驗證了自己确沸,你就可以取得這個堪置。當你走進大樓的時候(試圖從調(diào)用API獲取資源),你會被要求驗證你的護照张惹,而不是在前臺重新驗證舀锨。
獲取一個Token我們需要做的第一件事就是讓客戶端通過他們的賬號密碼交換token。這里有2種可能的方法在RESTful API里面宛逗。第一種是使用POST請求來通過驗證坎匿,使服務端發(fā)送帶有token的響應。除此之外,你可以使用GET請求替蔬,這需要他們使用參數(shù)提供憑證(指URL)告私,或者更好的使用請求頭。
二承桥、實戰(zhàn)演練
xxx項目驻粟,后臺語言-java,機制為cookie+session驗證
測試計劃構(gòu)建步驟:
1.添加線程組
2.在線程組下添加HTTP Cookie 管理器
3.在線程組下HTTP請求默認值凶异,在這里配置協(xié)議蜀撑、IP、端口號
4.在線程組下添加全部請求的察看結(jié)果樹
5.在線程組下添加HTTP請求1(可以用ID+接口名來重命名)
6.在HTTP請求1添加HTTP信息頭管理器
7.在HTTP請求1添加當前請求的察看結(jié)果樹
8.重復步驟5-7可以多添加幾個接口
各步驟配置詳情:
1.HTTP Cookie 管理器
①jmeter的bin目錄下jmeter.properties的文件剩彬,開放這個:CookieManager.save.cookies=true
②抓包工具查看cookie命名酷麦,若命名為tt_sessionid,或者通過前臺debug查看(我是通過debug看的)
③則在整個測試計劃需要獲取的cookie值為${COOKIE_tt_sessionid}喉恋,前面的COOKIE為jmeter命名規(guī)則
2.HTTP請求默認值
3.HTTP請求1
4.在HTTP請求1下的HTTP信息頭管理器
配置好了沃饶,大膽地run run run,當你看到如下畫面轻黑,證明你成功了糊肤!
xx項目,后臺語言-python氓鄙,機制為session驗證
測試計劃構(gòu)建步驟(無HTTP Cookie 管理器):
1.添加線程組
2.在線程組下HTTP請求默認值馆揉,在這里配置協(xié)議、IP玖详、端口號
3.在線程組下添加全部請求的察看結(jié)果樹
4.在線程組下添加HTTP請求1(可以用ID+接口名來重命名)
5.在HTTP請求1添加HTTP信息頭管理器
6.在HTTP請求1添加當前請求的察看結(jié)果樹
7.重復步驟4-6可以多添加幾個接口
各步驟配置詳情:
1.get/delete方法的HTTP信息頭管理器
2.post/put方法的HTTP信息頭管理器
異常錯誤:
1.jmeter報錯“org.apache.http.NoHttpResponseException”
就是第一個通過把介,后面全失敗,報錯為:? org.apache.http.NoHttpResponseException:xxxxIP?failed to respond
原因:在JMeter下蟋座,發(fā)送http 請求時拗踢,默認選擇了use keepAlive(Keep-Alive通俗地講,就是所謂的持久連接向臀,對于http這種大量的短連接的服務來說巢墅,開啟持久連接的好處可節(jié)省大量的TCP連接過程的開銷,據(jù)apache的官方文檔稱對包含大量圖片的HTML文檔造成的延時起到50%的加速作用)券膀,這個是連接協(xié)議君纫,JMeter坑就在這里,默認勾選了這個(如果不勾選的話芹彬,也不會保存)蓄髓,但其配置JMeter.properties中的時間設置默認卻是注銷的,不會等待舒帮,一旦連接空閑会喝,則立即斷開了陡叠,導致壓測中出現(xiàn)了事務失敗的情形。
可訪問https://wiki.apache.org/jmeter/JMeterSocketClosed查看官網(wǎng)解釋
解決方法:
①找到jmeter安裝路徑bin下的jmeter.properties肢执,編輯枉阵,設置httpclient4.idletimeout=,注意單位是ms预茄,設置成覺得合理的時間兴溜,一般可設置成10-60s(表示連接空閑10s后才會斷開)。修改完成后再次壓測耻陕,錯誤就沒出現(xiàn)拙徽。
例:httpclient4.idletimeout=3000,意思是連接空閑3s才會斷開
②去掉勾選 Use KeepAlive (日常在瀏覽器查看請求頭也可看到KeepAlive)
再來run時淮蜈,問題解決斋攀,我在這糾纏了好久已卷,哇哇哇梧田,是不是很開森。侧蘸。裁眯。
2.服務器相應數(shù)據(jù)中文為亂碼
看到這不認識的符號,是不是很懵逼讳癌,說好的中文名字呢穿稳??晌坤?
別著急逢艘,都是字符集惹的禍
解決辦法:
再來run,是不是中文名字回來了
至此骤菠,over它改!
作者:伊人風采_690d
鏈接:http://www.reibang.com/p/fe586a2b4c28
來源:簡書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)商乎,非商業(yè)轉(zhuǎn)載請注明出處央拖。