《码农翻身》读书笔记之浪潮之巅的Web

这是我的后端读书笔记系列文章的第三篇,选取的是最近刚刚圈粉的知名博主刘欣创作的《码农翻身》。

本文内容主要根据知名博主刘欣一作《码农翻身》的内容总结而来,本书的内容风趣幽默,讲解计算机理论原理也是十分透彻,由于书中常常以小故事的形式出现,为了方便学习和回顾,我把它们进行了一些改编和整理,便于自己和跟多人阅读。

本篇文章主要讲述的书中的第三章“浪潮之巅的Web”。

本文首发于我的个人博客:https://h2pl.github.io/

同时发表在csdn技术博客上:https://blog.csdn.net/a724888

也欢迎来我的GitHub中交流学习:https://github.com/h2pl/

Web的起源

很早以前http还没有出现,html也尚未问世,人们最多就是发送一下邮件,用ftp传递文件这些基本的功能。后来为了更好地进行资源共享和展示,出现了html文本,可以在上面展示各种内容。与之一起出现的是浏览器,浏览器可以解析html文本,渲染出页面。

只有html文本还不够,必须要解决通信和互联网访问的需求,于是url用于定位自愿,而HTTP协议也应运而生,很好地支持了互联网资源的访问。http服务器也相应产生,比如Apache。

世界开始互联,www万维网把这些小网连成了大网,实现了世界的互联。

两个程序的爱情故事

本地的进程通信采用的是共享内存等机制,速度较快效率也高。操作系统保证通信的正确性和同步。

而两台机器上的进程通信则必须使用网络传输,基于socket的进程通信也十分常见,客户端需要完成三次握手,然后进行io请求和接收。

socket会绑定端口号和ip进行服务监听,但是有的机器安装防火墙以后禁止了很多端口的访问,于是我们可以使用应用层协议比如http来绕过防火墙,因为它一般是监听80端口,且使用url作为endpoint来访问,不会被防火墙拦截。

web服务的描述方式有多种,除了应用于浏览器的html以外。
我们还可以用它来传输其他数据,比如进行服务调用。
这时候可以采用webservice的wsdl和soap,但是这个协议的数据太臃肿冗余了,还是用HTTP加json数据格式的方式进行传输最为方便高效。

一个故事讲完HTTPS

网络上的通信是明文通信,每个报文都可能被截取。

HTTP加密发展历程:

对称加密

可以使用加密算法加密明文,然后发送密钥给接收方,让其使用密钥进行解密。

但是密钥会被窃取或者替换,根本不安全。

非对称加密

上述使用对称加密的方法不安全,于是我们可以用非对称加密来保证安全,非对称加密使用公钥加密,私钥解密,公钥是公开的,丢失也无妨。

两者结合

上述方法虽好,但是非对称加密比对称加密慢百倍,于是可以结合两种加密方式,非对称加密传输密钥,然后用这个密钥进行对称加密。

中间人劫持

虽然上述方式不错,但是非对称加密中的公钥可能被攻击者替换,客户端用被替换的公钥进行加密,攻击者就可以获取报文内容了。

那么我们需要保证公钥没被替换,可以攘服务端到公正中心注册,证书中心颁发一个证书,包含着可信服务方的公钥。

数字签名

虽然证书保证公钥的可靠,但是证书传输过程中仍然可能被篡改,必须保证证书没有被修改,可以让认证中心CA对证书中的消息摘要(一般是一些头部信息)进行加密,形成数字签名,客户端验证此签名解密后的摘要和自己生成的摘要是否一样,就知道是否有被篡改了。

CA证书

事实上中间人还是可以伪装成CA来派发假的证书或者公钥,所以我们必须要知道CA的真实性。其实在操作系统和浏览器已经内置了一些CA证书,这些顶层的CA证书可以验证其他CA证书的真伪,所以有时候浏览器才会提示该证书可能不安全,这就是因为内置CA证书不认识这些外来证书。

HTTPS流程

浏览器发起https请求

服务端发送数字证书给客户端

浏览器用预置CA验证证书,提示风险

浏览器得到公钥,生成随机数,用公钥加密该随机数,发给服务端

服务端用私钥解密获得浏览器的随机数,用该随机数作为密钥和客户端进行对称加密通信

机房夜话(单点登录sso和cas)

cookie,session与token

多个系统如何实现一个系统登录,其他系统也自动登录呢。

首先想到的是,session用于保存登录状态,用cookie保存sessionid。
我们只要在访问其他系统的时候也带上cookie,是不是就能登陆成功呢。

这个方案有两个问题:

1 cookie不能跨域

2 即使使用二级域名来避免跨域,不同系统中的session互不相干,没有共享。

共享session

既然上面提到需要共享session,那我们那每个系统都访问session服务即可,session服务可以用redis来实现。

然而,异构的系统,语言可能不同,共享session的方式可能导致不兼容的问题,这也不是最好的方案。

使用token

token与session不同,只是一个特殊字符串,不需要保存在服务端,当用户登陆成功时服务端加密用户信息生成token,返回cookie给客户端,客户端保存cookie。

token里一般包含用户信息和签名,这部分数据还要进行一次加密。这样的话服务端通过解密算法得到用户信息和签名,对用户信息再进行一次加密,对比两个签名是否相同就可以知道该token是否是真的了。

这个办法不错,但是有一个问题,每个系统中的用户id可能都不同,生成的token也不同,并且每个系统的加密算法还必须一致,很不灵活。

cas单点登录实现

1 首先我们需要一个注册中心

2 对于每个系统的登陆请求,都会转发到这个注册中心上。

3 在注册中心登陆成功后,注册中心建立一个session,并且给浏览器一个cookie(这个cookie可以让浏览器下次访问注册中心时无须再登陆)。除此之外,还有很重要的一步,就是执行请求转发,redirect到之前对系统的访问请求,同时携带了一个注册中心生成的ticket。

4 这个ticket就是客户端访问其他系统的钥匙了。为什么呢。因为请求到达对方系统时,对方也会转发该请求到注册中心上,并且询问该ticket是否是注册中心所发,注册中心说是的,此时对方系统就会为客户端建立一个session,表示该用户已经登陆了,当然对方系统也会返回一个cookie给客户端,下次访问该系统时不需要再通过注册中心了。

5 当需要访问另一个系统B时,我们已不必再次在注册中心登录了,因为已经有了注册中心的cookie,直接访问系统B,B转发给注册中心,验证通过即可。

单点登出:
既然有单点登录,那么单点登出也是必不可少的,一个用户从任一系统登出,就要通知注册中心,删除session和客户端的cookie。还要通知各个系统把该用户相关的session进行删除。这样才能真正地实现退出。

从密码到token,一个有关授权的故事

第三方登录的实现

现在越来越多的app和web应用支持使用第三方渠道登录,比如微信,qq等等,但实际上第三方登录并不会让app应用真的得到你的用户密码。那么它是怎么做到的呢。

第三方登录首先是请求app登录,然后跳转到登录页面比如qq,然后输入用户名密码发送登陆请求,qq登录服务接收请求并且发送重定向请求,url中携带token字符串。

该token字符串是用户登录成功后qq服务提供的身份标识,app通过此token就可以到腾讯服务器获取该用户的qq基本信息了。

但是由于token加在url中明文传输不太安全,可能会被截获然后冒名登录。

OAuth认证方式

上述方式存在安全隐患,于是我们设想出了不在url中携带token,而是先让qq服务接受登录请求后先返回一个code认证码放在url中,app应用再通过这个code码,重新发送请求到认证服务器,本次发送不经过浏览器,所以获得到的token比较安全,并且code认证码可以设置有效时间,过期后不能使用,同时,code兑换token的请求只能执行成功一次,成功后code码自动删除。保证了一次登录的成功,避免重复登录和伪造登录。

后端风云

为了加快访问速度和缓解数据库压力,采用缓存比如Redis,为了克服单机瓶颈,开始从单机部署进化到多机部署。
多机部署需要请求分发,nginx可以做到这一点。

分布式方案:

1 nginx
nginx负责处理静态请求以及负载均衡,基本是无状态的,所以高可用只需要用keepalived即可实现主从部署。

2 Tomcat 服务器
Tomcat服务器采用集群就可以实现高可用,但是数据一致性需要额外保证,使用Redis存储session这类数据就可以保证集群的高可用。

3 Redis
服务器访问Redis集群需要进行主从部署,使用一致性hash进行分片。也可以使用hash slot也就是hash槽进行分片,Redis cluster就是根据这个方法进行集群部署的。每个节点都可以提供服务,只不过数据是分散存储的。

4 Mysql
MySQL可以使用主从复制进行部署,并且读写分离。

soa到微服务

soa太笨重了,类似webservice这样的服务使用wsdl和soap这样复杂的数据格式。

微服务则一般基于tcp自定义协议进行rpc调用,也可以使用http + json的方式传输数据,使用restful风格的api。

微信公众号

个人公众号:程序员黄小斜

微信公众号【程序员黄小斜】新生代青年聚集地,程序员成长充电站。作者黄小斜,职业是阿里程序员,身份是斜杠青年,希望和更多的程序员交朋友,一起进步和成长!专注于分享技术、面试、职场等成长干货,这一次,我们一起出发。

关注公众号后回复“2019”领取我这两年整理的学习资料,涵盖自学编程、求职面试、算法刷题、Java技术学习、计算机基础和考研等8000G资料合集。

技术公众号:Java技术江湖

微信公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,专注于 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发!

关注公众号后回复“PDF”即可领取200+页的《Java工程师面试指南》强烈推荐,几乎涵盖所有Java工程师必知必会的知识点。

《码农翻身》之浪潮之巅的Web相关推荐

  1. 码农翻身讲网络5:从Web安全到HTTPS

    浏览器:一个家族的奋斗 浏览器家族的安全反击战 黑客三兄弟 黑客三兄弟(续) 一个故事讲完https 深入浅出HTTPS工作原理 原创: 刘欣 码农翻身 2017-12-12 我是你们每天都要使用的浏 ...

  2. 从抄书到开源之巅:章亦春的程序人生(转载自微信公众号 -- 码农翻身)

    2018-04-08 章亦春 码农翻身 国人主导的开源软件能建立世界级影响力的不多,章奕春的OpenResty是其中之一. 让人没有想到的是,他的程序人生是从抄书开始的...... 本文转载自公众号& ...

  3. 《码农翻身》总结整理

    最近突然想把自己读过的一些书总结一下,做个记录.<码农翻身>是我毕业之后认真读过的第一本书,从此之后一发不可收拾,上网买了一堆博客大神推荐的书,读完之后也有自己的一些总结,后面会陆续补上. ...

  4. 国庆福利大放送:12本《码农翻身》+18本经典书包邮免费送

    国庆节马上就要到了,老刘为码农翻身的读者争取了一次十分给力的送书活动,一共30本,废话少说,直接上图: <编码> 希望你能顿悟硬件和软件之间的关系. <黑客与画家> 让硅谷创业 ...

  5. 码农翻身之——分布式,集群,负载均衡

    分布式:将不同的业务分布在不同的地方,这就构成了一个分布式的系统.(如下图所示) 假设由三个系统A.B.C构成的一个分布式系统(A作为主系统),那么会存在如下的问题--系统A是这个分布式系统的&quo ...

  6. 码农翻身讲计算机基础:并发,同步与信号量

    本文首发于我的个人公众号:程序员江湖 欢迎大家关注我的微信公众号:程序员江湖 努力成为最有影响力的程序员自媒体,专注于面试,职场,个人提升三大主题. 干货满满,不容错过. 那些烦人的同步和互斥问题 原 ...

  7. 码农翻身之编程语言的巅峰

    "哇塞,怎么可能这么简单!" 当C语言老头儿还是小伙子的时候,第一次见到了汇编,发出了这么一声感慨. 在C语言看来,这汇编的指令实在是太简单了,简单到了令人发指的地步,只有这么几类 ...

  8. 【读书笔记】码农翻身 - 简介

    作为一个从业12年的老码农来说,经历了软件行业十年来的沧海桑田,套用IT行业的一个术语 - "变化是永恒的". 然,追求真理,追求解决问题的金钥匙是我们这个行业乃至人生的重要目标之 ...

  9. 给大忙人看的码农翻身记

    码农翻身记个人读后感 文章目录 码农翻身记个人读后感 本书介绍 大纲 启发 分享 个人的能力欠缺的地方 书中比较棒的建议 本书介绍 <码农翻身>用故事的方式讲解了软件编程的若干重要领域,侧 ...

  10. 《码农翻身》之技术之路

    <码农翻身>读书笔记之技术之路 这是我的后端读书笔记系列文章的第四三篇,选取的是最近刚刚圈粉的知名博主刘欣创作的<码农翻身>.这篇文章只是最后一部分内容. 本文内容主要根据知名 ...

最新文章

  1. 服务器要最多能装多少个cpu,服务器主机可以装多少个cpu
  2. 组播穿越MPLS ×××+SSM
  3. Tesseract-OCR引擎 入门
  4. JZOJ 4726. 【NOIP2016提高A组模拟8.22】种花
  5. 多米诺骨牌v.1MEL语言
  6. 如何用Python进行大数据挖掘和分析
  7. 获取移除指定Url参数(原创)
  8. 求一批整数中出现最多的个位数字
  9. 关于冒泡、快排、二分排序算法分析
  10. 视频教程-2020软考--网络规划设计师【综合知识】视频精讲-软考
  11. web前端——旋转3D魔方
  12. 第十五章 输入/输出
  13. T-SQL简介及基本语法
  14. Android设置状态栏的字体颜色
  15. SOA:ESB 服务注册中心
  16. 【单片机】人体感应模块
  17. 主板和机箱螺丝孔对不上?
  18. 【01 dp】A005_LC_生成数组(暴搜 / 记忆化 / dp)
  19. GL、GLU、GLUT
  20. mysql sys库 oom_MySQL OOM解决方案

热门文章

  1. python 模拟用户点击浏览器_Selenium(python版本)如何启动浏览器模拟点击网页链接或按钮?...
  2. OpenCasCade – 载入IGES文件
  3. 解决qt调试时Unknown debugger type No Engine
  4. 密码库LibTomCrypt学习记录——(2.2)分组密码算法的工作模式——ECB模式
  5. 熊猫烧香病毒(jusodl.exe severe.exe conime.exe)及其变种病毒专杀
  6. 计算机考研什么时候开始备考,上岸前辈告诉你,考研数学什么时候开始复习最好?...
  7. 视频教程-通俗易懂的JavaScript高级教程(含资料)-JavaScript
  8. phpstudy下载及简单使用教程
  9. 计算机考试准考证怎么下载
  10. 如何彻底删除SQL 2005数据库(完整版)