Home | 簡體中文 | 繁體中文 | 雜文 | 知乎專欄 | Github | OSChina 博客 | 雲社區 | 雲棲社區 | Facebook | Linkedin | 視頻教程 | 打賞(Donations) | About
知乎專欄多維度架構 微信號 netkiller-ebook | QQ群:128659835 請註明“讀者”

13.5. 介面安全

13.5.1. Restful 安全問提

Restful 的通信安全有很多中解決方案,例如

  1. HTTP Basic Auth 認證

  2. Cooke / Session 認證

  3. Token 認證

  4. Oauth / OpenID

等等,每一種方案都很成熟,這裡不依依解釋,如果不瞭解,請去搜索引擎查找相關資料。這裡我談談在實施微服務項目中的心得,首先項目採用 Spring cloud 方案,Spring cloud 有自己的RestController 控製器,我們需要遵循他的規範開發,這就限制了很多傳統的認證加密方法不能應用到 Spring cloud中。

例如傳統restful 使用 POST 方式提交,POST 數據格式如下:

		
name=Neo&age=23&md5=xxxxxxx
		
			

然後做 token 校驗。

而 Spring cloud 使用 raw 格式的數據做POST提交,例如

				@RequestMapping(value = "/member/create", method =
				RequestMethod.POST)
				public void create(@RequestBody Member member)
			

我們不想在Spring框架上做額外的改動,又想解決信息的安全問題。

13.5.2. 第一個階段採用 HTTP Basic Auth

這個方案簡單,實施起來最為方便,因為項目比較緊急,所以就採用了這個方案,這個方案既可以在運維方處理,也可以在開發方處理,對於 Spring boot 只需引入Spring Security 簡單配置,立即生效。

實現方式請參考: Spring boot with Spring security

13.5.3. 第二階段 HTTP Basic Auth + SSL

上面的方案適合在防火牆內部的伺服器間通信,如果跨機房或者在廣域網上就不在安全了,通過嗅探器抓包,包括 http basic auth 的用戶和密碼,以及介面數據沒有安全可言。 為Web 伺服器增加 SSL 證書,可以解決信息安全問提。

證書可以使用CA機構頒發的證書,也可以自己生成證書。

證書可以配置在Web伺服器上如Nginx, 實現方式請參考: http://www.netkiller.cn/www/nginx/conf.html#http2 《Netkiller Web 手札》

也可以配置在 Spring boot 中, 實現方式請參考: Spring boot with HTTPS SSL

這個方案可以滿足絶大部分用戶的需求。

13.5.4. 第三階段 HTTP2 + HTTP Basic Auth + Oauth2

由於需要為手機端提供 restful 服務,之前的方式已經不能滿足我們的需求,之前的方式更適合提供私有服務,不適合提供公共服務。所謂私有服務是指它的使用範圍限制在企業內部,或者事業部間共享服務,總的來說可以通過防火牆控制服務區域。

對於公共服務 OpenID/Oauth 更適合,我們不關心用戶地理位,終端設備的情況。實現方式請參考: Spring boot with Oauth2

13.5.5. 第三階段,終極版誕生,HTTP2 + HTTP Basic Auth + Oauth2 + Jwt

  1. SSL 雙向認證

  2. HTTP Basic Auth 認證

  3. Oauth2 認證

這是我們最終的方案,雙向認證是伺服器與客戶端兩端都需要證書才能通信。

		
App(IOS/Android) -->  SSL 雙向認證 --> SLB/Proxy --> Feign Client 		
		
			

file:///Users/neo/tmp/spring/security/oauth2.html#oauth2.jwt