当前位置: 首页 > 编程语言 > Basic

测试浏览器的基本认证功能

时间:2023-11-28 12:03:54 Basic

在我们使用浏览器访问一些网站时,有时会遇到一个弹出的对话框,要求我们输入用户名和密码,才能继续浏览。这种对话框是浏览器的一种安全机制,叫做基本认证(BASIC authentication)。基本认证是一种最简单的用户身份验证方法,它可以防止未经授权的用户访问受保护的资源。但是,基本认证也有一些缺点,比如密码是以明文的形式传输的,容易被窃取或篡改,而且每次访问都需要输入用户名和密码,比较麻烦。因此,基本认证一般只用于一些不太重要的场合,或者配合其他的加密手段使用。


那么,浏览器是如何实现基本认证的呢?我们可以通过一个简单的例子来演示一下。首先,我们需要一个可以提供基本认证的服务器,这里我们使用一个基于 Spring Boot 的 Java 项目,它可以在本地运行一个简单的 Web 服务。我们可以在[这里]下载这个项目的源码,然后用 Eclipse 或者其他的 IDE 打开它,运行 BootDemoApplication.java 文件,就可以启动这个服务。这个服务的端口号是 8089,它有一个受保护的资源,就是 /login 这个 URL,它会返回一个简单的网页,显示“登录成功”。为了访问这个资源,我们需要提供一个用户名和密码,这里我们设定的用户名是 admin,密码是 123456。


接下来,我们打开浏览器,输入 http://localhost:8089/BootDemo/login,然后按回车键,就会弹出一个对话框,这个对话框就是浏览器的基本认证对话框,它会提示我们输入用户名和密码,然后点击确定按钮。如果我们输入正确的用户名和密码,就可以访问 /login 这个资源,看到如下图所示的网页:


如果我们输入错误的用户名或密码,或者点击取消按钮,就会再次弹出这个对话框,要求我们重新输入。这个过程会一直重复,直到我们输入正确的用户名和密码,或者关闭浏览器。


那么,这个过程背后发生了什么呢?我们可以用一个抓包工具,比如 Fiddler 或者 Wireshark,来查看这次请求的信息。我们会发现,当我们第一次输入 http://localhost:8089/BootDemo/login 时,浏览器会向服务器发送一个 GET 请求,如下图所示:


这个请求的头部信息中,没有包含任何关于用户名和密码的信息,只是告诉服务器,浏览器可以接受的内容类型,以及浏览器的类型和版本等。服务器收到这个请求后,会判断这个请求是否需要认证,如果需要,就会返回一个 401(Unauthorized)的响应,如下图所示:


这个响应的头部信息中,有一个很重要的字段,就是 WWW-Authenticate,它告诉浏览器,服务器需要的认证方式是 BASIC,以及认证的范围是 BootDemo。这个字段的格式是:


其中,<scheme> 表示认证方式,<realm> 表示认证的范围,它们都是由服务器定义的。除了 BASIC,还有其他的认证方式,比如 DIGEST,NTLM,BEARER 等,它们各有各的优缺点,这里不再详细介绍。


浏览器收到这个响应后,就会根据 WWW-Authenticate 字段的内容,弹出相应的认证对话框,要求用户输入用户名和密码。如果用户输入了用户名和密码,浏览器就会把它们进行 Base64 编码,然后再次向服务器发送一个 GET 请求,这次请求的头部信息中,会多出一个字段,就是 Authorization,它的格式是:


其中,<scheme> 表示认证方式,<credentials> 表示经过编码的用户名和密码,它们之间用一个空格隔开。例如,如果我们输入的用户名是 admin,密码是 123456,那么经过 Base64 编码后,就会得到 YWRtaW46MTIzNDU2,那么 Authorization 字段的内容就是:


这个请求的头部信息如下图所示:


服务器收到这个请求后,就会根据 Authorization 字段的内容,进行解码,得到用户名和密码,然后进行验证,如果验证通过,就会返回一个 200(OK)的响应,以及 /login 这个资源的内容,如下图所示:


浏览器收到这个响应后,就会显示这个资源的内容,也就是“登录成功”的网页。如果验证失败,服务器就会再次返回一个 401(Unauthorized)的响应,以及 WWW-Authenticate 字段,浏览器就会再次弹出认证对话框,要求用户重新输入用户名和密码,这个过程会一直重复,直到验证通过,或者用户放弃访问。


这就是浏览器的基本认证的原理和过程,通过这个例子,我们可以了解到,基本认证是一种基于 HTTP 协议的用户身份验证方法,它是通过在请求和响应的头部信息中,添加 Authorization 和 WWW-Authenticate 字段,来实现的。基本认证的优点是简单易用,不需要额外的客户端或服务器端的软件或硬件,只需要浏览器和服务器就可以实现。基本认证的缺点是不够安全,因为用户名和密码是以明文的形式传输的,容易被窃取或篡改,而且每次访问都需要输入用户名和密码,比较麻烦。因此,基本认证一般只用于一些不太重要的场合,或者配合其他的加密手段使用。