Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HTTP入门到熟练 #9

Open
kangkai124 opened this issue Mar 13, 2019 · 4 comments
Open

HTTP入门到熟练 #9

kangkai124 opened this issue Mar 13, 2019 · 4 comments
Labels

Comments

@kangkai124
Copy link
Owner

http,鉴权等

@kangkai124
Copy link
Owner Author

cookie-session 验证过程

由于http请求时是无状态的,服务器正常情况下是不知道当前请求之前有没有来过,这个时候我们如果要记录状态,就需要在服务器端创建一个会话(seesion),将同一个客户端的请求都维护在各自得会会话中,每当请求到达服务器端的时候,先去查一下该客户端有没有在服务器端创建seesion,如果有则已经认证成功了,否则就没有认证。

  1. 服务器在接受客户端首次访问时在服务器端创建seesion,然后保存seesion(我们可以将seesion保存在内存中,也可以保存在redis中,推荐使用后者),然后给这个session生成一个唯一的标识字符串,然后在响应头中种下这个唯一标识字符串。
  2. 签名。这一步只是对sid进行加密处理,服务端会根据这个secret密钥进行解密。(非必需步骤)
  3. 浏览器中收到请求响应的时候会解析响应头,然后将sid保存在本地cookie中,浏览器在下次http请求de 请求头中会带上该域名下的cookie信息,
  4. 服务器在接受客户端请求时会去解析请求头cookie中的sid,然后根据这个sid去找服务器端保存的该客户端的session,然后判断该请求是否合法。
var express = require('express');
var RedisStore = require('connect-redis')(express.session);
var app = express();
var secret  = "wang839305939"
// 设置 Cookie
app.use(express.cookieParser(secret));

// 设置 Session
app.use(express.session({
  store: new RedisStore({
    host: "127.0.0.1",
    port: 6379,
    db: "session_db"
  }),
  secret: secret
}))

app.get("/", function(req, res) {
  var session = req.session;
  session.time= session.time|| 0;
  var n = session.time++;
  res.send('hello, session id:' + session.id + ' count:' + n);
});

app.listen(9080);

@kangkai124
Copy link
Owner Author

token 验证

使用基于 Token 的身份验证方法,大概的流程是这样的:
  1. 客户端使用用户名跟密码请求登录
  2. 服务端收到请求,去验证用户名与密码
  3. 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
  4. 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
  5. 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
  6. 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据

token 和 cookie-session 的区别:

  1. 服务器根据前端传过来的 sessionid 来查询保存自己这的 session,这里面才保存这用户的登录状态。而 token 本身就是一种登陆成功凭证,本身就保存着用户的登录状态,服务端只需要校验这个 token 是否合法就行。
  2. cookie-session 的 cookie 只能在浏览器使用,原生 APP 等不起作用。但是 token 是请求响应体返回的信息,客户端可以存在本地的 cookie、storage、或者内存中,所以 token 适用的客户端种类更加丰富。
  3. 时效性,token 可以在一段时间内动态改变,而 cookie-session 的 sessionid 在登录到登出是不变的。
  4. token 本身比较灵活,解决方案多,所以可扩展性强。如下面的 JWT

@kangkai124 kangkai124 changed the title http,鉴权等 http 入门 Apr 12, 2019
@kangkai124 kangkai124 added the HTTP label May 7, 2019
@kangkai124
Copy link
Owner Author

如何判断网站是否启用HTTP2

Chrome 中输入:

window.chrome.loadTimes()

输出的connectionInfo 和 npnNegotiatedProtocol 是h2就说明使用的是http2

@kangkai124
Copy link
Owner Author

HTTP 首部字段

1. 通用首部字段

Cache-Control 缓存控制✨

  • no-cache:防止从缓存中返回过期的资源
  • no-store:禁止缓存
  • mas-age:设置缓存时间

Connection ✨

  • 控制不再转发给代理的首部字段
  • 管理持久连接

Date 创建报文的时间

Trailer 说明在报文末端的有哪些首部,分块传输时使用

Transfer-Encoding 报文主体的传输编码格式✨

Via 代理服务器的相关信息,报文经过代理或网关在 Via 中加上改服务器信息

2. 请求首部字段

Accept 能够处理的媒体类型✨

  • 文本 text/html, text/plain, application/xml
  • 图片 image/jpeg, image/gif
  • 视频 video/mpeg, video/quicktime
  • 二进制文件 application/octet-stream, application/zip
  • all * / *

Accept-Charset 支持的字符集

Accept-Encoding 支持的编码格式 gzip compress deflate identity

Accept-Language 支持的自然语言

Accept-Language: zh-cn,zh;q=0.7,en-us,en;q=0.3

​ 优先返回中文,因为权重q大(q介于0-1)

Authorization web认证信息✨

Host 请求的资源所在的服务器✨(Host必须在请求头内)

If-Match 比较实体的标记 Etag✨

If-none-Match 与上相反

If-Modified-Since 比较资源的更新时间(Last-Modified)✨

If-Unmodified-Since 在指定的时间后未发生更新的情况,才处理请求

If-Range

Max-forwards 最大跳帧处

Range 部分资源的范围请求✨

Referer 请求的原始URL

User-Agent 客户端信息✨

3. 响应首部字段

Accept-Ranges 告知客户端服务器时候能处理范围请求

Age 推算资源创建经过时间

Location 令客户端重定向的URI ✨

Etag 能够表示资源唯一资源的字符串 ✨

Server 服务器的信息 ✨

4. 实体首部字段

实体首部字段是包含在请求报文和响应报文中的试题部分使用的首部,用于补充与实体相关的信息。

Allow 支持的HTTP请求方法✨

Content-Language 实体的资源语言

Content-Encoding 实体的编码格式

Content-Length 实体的大小

Content-MD5 实体报文的摘要

Content-type 媒体类型✨

Expires 资源失效日期✨

Last-Modified 资源最后修改的日期✨

5. Cookie相关的首部字段

Set-Cookie 服务器告诉客户端,我要管理你的状态了

Set-Cookie: status=enable;expires=Tue,05 Jul 2011 07:26:31

Set-Cookie 字段的属性

属性 说明
name=value✨ Cookie的名称和值
expires=Date✨ 有效期,不指定为浏览器关闭为止
path=Path 服务器上的文件目录
domain=域名 Cookie适用对象的域名
Secure✨ 仅在HTTPS安全通信时发送Cookie
HTTPOnly✨ 禁止JS访问Cookie

Cookie 客户端告诉服务端,我需要你的支持

Cookie 里带着服务器发来的Cookie值

@kangkai124 kangkai124 changed the title http 入门 HTTP入门到熟练 Jul 30, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant