遇到的問題:前端發布了項目代碼,后端在本機上,用發布的項目代碼訪問本機,遇到了cookie不能攜帶的問題,跨域的問題?
參考鏈接:https://www.jianshu.com/p/806d0514ec7d
先搞清楚域名、ip和端口號:
ip:ip是是分配給網絡上使用IP協議的設備的數字標簽。我們現在經常使用的是 ipv4, 由32位二進制數字組成,常以XXX.XXX.XXX.XXX形式表現。
域名:是由一串用“點”分隔的字符組成的Internet上某一台計算機或計算機組的名稱,用於在數據傳輸時標識計算機的電子方位。如 i.cnblogs.com。
域名按域名系統(DNS)的規則流程組成。在DNS中注冊的任何名稱都是域名。域名用於各種網絡環境和應用程序特定的命名和尋址目的。
域名和ip有區別也有聯系,域名通常都會和IP綁定起來,通過訪問域名來訪問網絡主機上的服務。ip地址通常是指主機,而域名通常表示一個網站。一個域名可以綁定到多個ip,多個域名也可以綁定到一個ip。
域名系統(DNS):因特網上作為域名和ip地址相互映射的分布式數據庫,能使用戶更方便地訪問互聯網,而不用去記住能夠被機器直接讀取的IP地址。通過主機名,最終得到該主機名對應的ip地址的過程叫做域名解析。 DNS協議運行在UDP協議之上,端口號53。
端口號:端口,(英語:port),主要分為物理端口和邏輯端口。我們一般說的都是邏輯端口,用於區分不同的服務。因為網絡中一台主機只有一個IP,但是一個主機可以提供多個服務,端口號就用於區分一個主機上的不同服務。一個IP地址的端口通過16bit進行編號,最多可以有65536個端口,標識是從0~65535。端口號分為公認端口(0~1023)、注冊端口(1024~49151)和動態端口(49152~65535)。我們自己的服務一般都綁定在注冊端口上。
跨域:在 HTML 中,<a>
, <form>
, <img>
, <script>
, <iframe>
, <link>
等標簽以及 Ajax 都可以指向一個資源地址,而所謂的跨域請求就是指:當前發起請求的域與該請求指向的資源所在的域不一樣。這里的域指的是這樣的一個概念:我們認為若協議 + 域名 + 端口號均相同,那么就是同域。
跨域請求的安全問題:通常,瀏覽器會對上面提到的跨域請求作出限制。瀏覽器之所以要對跨域請求作出限制,是出於安全方面的考慮,因為跨域請求有可能被不法分子利用來發動 CSRF攻擊。
舉例:
http://www.123.com/index.html 調用 http://www.123.com/server.php (非跨域)
http://www.123.com/index.html 調用 http://www.456.com/server.php (主域名不同:123/456,跨域)
http://abc.123.com/index.html 調用 http://def.123.com/server.php (子域名不同:abc/def,跨域)
http://www.123.com:8080/index.html 調用 http://www.123.com:8081/server.php (端口不同:8080/8081,跨域)
http://www.123.com/index.html 調用 https://www.123.com/server.php (協議不同:http/https,跨域)
請注意:localhost和127.0.0.1雖然都指向本機,但也屬於跨域。
瀏覽器執行javascript腳本時,會檢查這個腳本屬於哪個頁面,如果不是同源頁面,就不會被執行。
CSRF攻擊:
CSRF(Cross-site request forgery),中文名稱:跨站請求偽造,也被稱為:one click attack/session riding,縮寫為:CSRF/XSRF。CSRF攻擊者在用戶已經登錄目標網站之后,誘使用戶訪問一個攻擊頁面,利用目標網站對用戶的信任,以用戶身份在攻擊頁面對目標網站發起偽造用戶操作的請求,達到攻擊目的。
CSRF 攻擊的原理大致描述如下:有兩個網站,其中A網站是真實受信任的網站,而B網站是危險網站。在用戶登陸了受信任的A網站是,本地會存儲A網站相關的Cookie,並且瀏覽器也維護這一個Session會話。這時,如果用戶在沒有登出A網站的情況下訪問危險網站B,那么危險網站B就可以模擬發出一個對A網站的請求(跨域請求)對A網站進行操作,而在A網站的角度來看是並不知道請求是由B網站發出來的(Session和Cookie均為A網站的),這時便成功發動一次CSRF 攻擊。
因而 CSRF 攻擊可以簡單理解為:攻擊者盜用了你的身份,以你的名義發送而已請求。CSRF能夠做的事情包括:以你名義發送郵件,發消息,盜取你的賬號,甚至於購買商品,虛擬貨幣轉賬......造成的問題包括:個人隱私泄露以及財產安全。
因此,大多數瀏覽器都會跨域請求作出限制,這是從瀏覽器層面上的對 CSRF 攻擊的一種防御,但是需要注意的是在復雜的網絡環境中借助瀏覽器來防御 CSRF 攻擊並不足夠,還需要從服務端或者客戶端方面入手防御。詳細可以參考這篇文章淺談CSRF攻擊方式
域名和端口怎樣對應起來的:
客戶端輸入域名,通過DNS將域名解析成為服務器ip,找到代理服務器,因為http協議服務所占用的端口默認為80端口,所以會訪問服務器的80端口,然后再通過代理服務器將請求轉發到不同的服務器以及端口中。
是否應該通過域名訪問項目:
如果用IP+端口號的方式訪問,會有以下后果
首先,IP非常難記, 域名是對人友好的有含義的字符,而ip都是4組基本無規律的數字,對人不友好。
其次, 如果服務器中的資源發生遷移,那么原先的服務器ip地址就無效了,必須要重新使用新的ip地址訪問服務器,用戶還要再去記憶一遍IP地址。但是如果是使用域名則不存在這個問題。
最后, 不安全, 通過ip直接訪問服務器是非常危險的,相當於將整個服務器的大門向所有人打開,造成的后果是別有用心的人能夠非常容易攻擊到服務器.域名訪問就能杜絕這種情況,用戶是不知道服務器的IP地址的,而且就算有人通過域名惡意攻擊,直接和用戶交互的代理服務器也可以保護內容服務器。這樣就算代理服務器被攻破,損失也相對較小。