IP请求会产生跨域问题么?

4,316 阅读3分钟

自从前后端分离了,跨域相关问题就经常被问到,网上一搜一大堆解决方案,一大堆原理解释为什么会跨域,如何去解决跨域问题。但,今天,前java同事突然问了我一个问题:“项目在线上的时候,前端访问后端,你们是直接配的IP地址,还是通过域名访问的”。“域名啊”(我不假思索的回答完,继续敲代码)。“我们前端说用IP访问,这样更安全,而且还没跨域问题。” 这。。。。。。。。

没错,我犹豫了,是我故步自封了,我怎么觉得有点问题呢?然后带着自己那浅薄的知识储备开始翻资料给自己科普科普。

同源的定义

资料来源

如果两个 URL 的 protocol、port (en-US) (如果有指定的话)和 host 都相同的话,则这两个 URL 是同源。这个方案也被称为“协议/主机/端口元组”,或者直接是 “元组”。(“元组” 是指一组项目构成的整体,双重/三重/四重/五重/等的通用形式)。

5b5fd429ca8c625b04e504902170437b1603776575625.png

一般造成跨域的情况

// 域名不同 (域名访问和 ip 访问也造成跨域)
    http://www.dog.com (120.0.0.0)
    http://120.0.0.0

    http://www.dog.com
    http://www.cat.com

//  子域名不同
    http://www.dog.com
    http://m.dog.com

//  端口不同
    http://www.dog.com(:80)
    http://www.dog.com:8080

//  协议不同
    http://www.dog.com
    https://www.dog.com

为了更加验证单纯IP请求能不能触发跨域问题,我恬不知耻的去麻烦了公司的服务端给我本地启个服务,然后把代理关了,把他们的cors拦截给关了。为了保持变量的统一,还要求他把端口号改成和我一样的端口,这样就只有IP地址是唯一变量了。。。。回车,一发入魂。

  • 触发了浏览器的 preflight 跨域问题 取消了头部参数,再次请求
  • 触发了一般跨域问题

实验到此结束,然后雄赳赳气昂昂的去回复前同事的消息了

结论思考

  1. 在不同主机上通过 IP 去请求接口就已经违反了同源策略了,跨域并不只是域名不同才会有问题(一般情况下,的确也能这样去判定)。一台服务器对应一个IP地址(即使是vps最终回源的IP也就只有一个),前后端分开部署,那主机肯定是不一样的。更何况现在大部分的前端SPA项目都直接部署在cdn上。
  2. IP请求更安全?如果还是在前后端分离的前提条件下去讲这个问题的话,IP连HTTPS都加不了,从何谈安全?如何实现反向代理,负载均衡?
  3. 多个域名可以指向同一个IP地址,只要分配不同 host就行,而且如果后续更换服务器,也不需要更改项目请求地址,只要重新解析域名就行。

用域名而不用IP,大多数似乎都已经形成了一种共识,要是突然有人质疑你了,要么他是大神,要么他就是公司的老人。。。

以上,写完。少了点不安,多了一片知识盲区