正向代理:客戶端将流量重定向到burpsuite等軟件或連接到VPN再訪問服務器而不是直接訪問服務器的場景。流量流動方向是真正機器--代理服務器。正向代理又(yòu)稱代理、普通代理。
反向代理:服務器端使用反向代理服務器統一(yī)接收客戶端訪問,然後再按即定規則将數據包重定向到真正的服務器的場景。流量流動方向是代理服務器--真正機器,與正向代理正好相反所以稱反向代理(其實我(wǒ)覺得這此名詞應是先有代理再有反向代理再有正向代理)。
相互關系:除了名詞相反外(wài),由于代理是客戶端行爲反向代理是服務端行爲所以可以随意使用,在技術上兩不相幹。
假設客戶端代理訪問了有反向代理的服務器:
C--客戶端;PC--客戶端代理服務器;PS--服務端代理服務器;S--服務器
發出數據包機器(方向從左向右) | C | PC | PS |
所發出數據包中(zhōng)的源IP和端口 | C | PC | PS |
所發出數據包中(zhōng)的目的IP和端口 | PC | PS | S |
發出數據包機器(方向從左向右) | S | PS | PC |
發出數據包的源IP和端口 | S | PS | PC |
發出數據包的目的IP和端口 | PS | PC | C |
這個例子要再次聲明這樣的原則:對于網絡中(zhōng)的一(yī)跳,其從上一(yī)跳接收的數據包中(zhōng)的目的地址一(yī)定是它,其發往下(xià)一(yī)跳的數據包中(zhōng)的源地址一(yī)定是它;這不會因爲包括其本身用途在内的任何原因而改變。
所以以PS爲例,其收到的數據包目的地址一(yī)定是PS然後再由其重新封裝數據包将目的地址改爲S,而不可能PS收到的數據包的目的地址直接是S;即便它隻是純粹向S轉發數據包的代理服務器。
PS要和外(wài)網交流又(yòu)要和内網交流,所以其需要一(yī)張外(wài)網網卡和一(yī)張内網網卡。
負載均衡:以一(yī)設備統一(yī)接收客戶端請求再按即定規則從多台相同服務器從選出一(yī)台将數據包重定向到這台服務器上的場景。
負載均衡可以理解爲反向代理的子集,其在反向代理中(zhōng)加入了“多台相同服務器”的限定;當然你要說“不同服務器”(如一(yī)台JSP服務器和一(yī)台PHP服務器使用NGINX做反向代理)的反理也可以叫負載均衡那我(wǒ)也覺沒什麽問題。
軟負載和硬負載:
軟負載:就是通過軟件來實現負載均衡功能;Nginx和httpd等http服務器都能實現軟負載功能。
硬負載:又(yòu)叫硬件負載,就是把實現負載均衡功能的軟件搬到一(yī)台專門的計算機上;比如F5等設備。
軟負載與硬負載的區别和軟件防火(huǒ)牆與硬件防火(huǒ)牆的區别是一(yī)樣的。
負載均衡與會話(huà)同步:
在負載均衡中(zhōng)可以将來自同一(yī)個IP的訪問通過IP_HASH等方式全定向到一(yī)台機器上。這樣一(yī)來所有會話(huà)(session)就全在一(yī)台機器上,就不必使用會話(huà)同步了。
但IP_HASH的問題是如果某台服務器故障而請求一(yī)樣被發送過去(qù),那麽這些訪問請求被發送到故障機的IP将無法得到服務,我(wǒ)的服務器分(fēn)明還有多台正常而我(wǒ)的用戶卻隻因一(yī)台故障即不能訪問,這并不能最大(dà)化多台服務器的效益。
會話(huà)中(zhōng)保存着用戶的登錄狀态,而如果請求是按即定算法被分(fēn)配到不确定的服務器上那麽就得保證會話(huà)同步,以确保在S1上登錄過的用戶其請求被重定向到S2時其狀态也是登錄的(而不是又(yòu)讓用戶再次登錄這樣的網站沒人願意用)。
會話(huà)同步實現的思路是無論哪台服務器的session都存放(fàng)到一(yī)台服務器上,請求無論被分(fēn)配到S1還是S2都是到那台服務器上取session。
而在session服務器的存儲又(yòu)有兩種方案,一(yī)是使用oracle等傳統數據庫存儲,二是使 用memcache等内存數據庫存儲;後者方案是更加推薦的。
session比cookie更安全嗎(ma)?
所謂的cookie不安全主要是指用戶名/密碼/登錄狀态等會話(huà)信息全部存在了cookie中(zhōng),一(yī)是cookie被盜那麽信息洩漏得多,二是如果以登錄狀态值标識用戶登錄狀态從而決定是否有操作權限那麽完全可能是僞造cookie實現越權。
session一(yī)般是生(shēng)成一(yī)個sessionID存放(fàng)到cookie中(zhōng),如果cookie被盜那麽攻擊者一(yī)樣是可以使用該sessionID登錄的,隻是說沒洩漏用戶名等信息僞造sessionID也不能僞造其登錄狀态(這兩點安全性就提高好多了)。
禁用cookie後session就不能用了嗎(ma)?
session的根本原理是以一(yī)個sessionID标識用戶,客戶端無論從哪把sessionID傳到服務器都是可以的不一(yī)定要通過cookie,這是嚴謹但不負責任的回答。
在一(yī)般的session實現中(zhōng)我(wǒ)們生(shēng)成sessionID并将其put到cookie中(zhōng),由于是cookie是自動提交的所以,我(wǒ)們在設計客戶端請求時完全不用考慮sessionID的上傳。
如果我(wǒ)們不将sessionID放(fàng)到cookie,那麽再沒第二個和cookie這樣自動下(xià)傳又(yòu)自動上傳的字段,這意味着如果不通過cookie那麽在服務端下(xià)傳後在客戶端請求時需要手動将sessionID附到某個字段中(zhōng)。
輕則要附到URL中(zhōng)作爲參數,重則要js将sessionID附到http頭的其他字段中(zhōng)或post的body中(zhōng);一(yī)兩個頁面還沒什麽,要是全站使用和考濾網站擴展性,這工(gōng)作量并不是可以輕描淡寫。
所心結論是禁用cookie後session還是有方法可以實現的,但這比較麻煩。