-
Notifications
You must be signed in to change notification settings - Fork 39
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
[译]Introduction to JSON Web Tokens #170
Comments
什么是JSON Web Token?
|
什么时候使用JSON Web tokens?下面这些场景下,JSON Web Tokens是有用的:授权和信息转换。 授权这是JWT最常用的场景。一旦用户登录进来,随后的请求都会带上JWT,允许用户获得token允许的routes,services和资源。SSO是现今广泛使用JWT的一个特性,因为其开销小,以及跨域名可以很容易实现。 信息转换JWT是两个组织之间进行安全信息传输的很好的方式。因为JWT可以签名---例如,使用public/private键对,可以确定发送者就是他们说的那个人。除此之外,使用header和payload计算签名,可以验证内容是否被人篡改。 |
JSON Web Token结构是什么样的?JWT的结构很简单,JSON Web Tokens由三部分组成,它们之间通过.连接。 Headerheader由两部分组成:token的类型,也就是JWT;token的签名算法,可以是HMAC,SHA256和RSA。 {
"alg": "H256",
"typ": "JWT",
} 编码是Base64Url格式的,作为JWT的第一部分。 Payloadtoken的第二部分是payload,其中包含了claims(声明)。 Registered claims有一个预先定义好的claim集合,不是强制的但是非常推荐的,去提供有用的彼此协作的claim。其中包括,iss(issuer),exp(expiration time),sub(subject),aud(audience)和其他的。 注意:claim或者声明的名字只有3个字符长的原因,是因为JWT的目的是紧凑。 Public claims这些可以由使用JWT的人随意定义。但是为了避免collision它们应该在IANA JSON Web Token Registry注册或者可以定义成一个URI,这个URI上包含了一个耐碰撞名称空间。 Private claims这些是自定义的claim。两个组织之间约定好既不通过registered claim也不通过public claim,而是通过自定义的claim去分享信息。 一个payload示例如下:
编码是Base64Url格式的,作为JWT的第二部分。 Signature为了创建编码头的signature部分,在header上需要指明编码后的payload,编码后的payload和一个secret,以及签名算法并且签名。 例如如果你想用HMAC SHA256算法,签名会按照下面的方式创建:
签名用于验证消息在整个过程中没有被更改,并且,对于使用私钥签名的令牌,它还可以验证JWT的发送方就是它所说的发送方。 Putting all together输出是3个被.分离的Base64-URL字符串,可以在HTML和HTTP环境中传输,与基于XML的标准比如SAML相比,这种格式更简单。 下面的输出表示JWT的header和payload是编码过的,并且用一个secret做签名。 如果想体验一下JWT,可以用jwt.io Debugger去解码,验证以及生成JWT。 我司由于最近才接入了单点,经验不是很成熟,所以jwt中包含了用户密码的敏感数据。 存储在localStorage中的jwt,payload中包含了用户密码,使用https://hashkiller.co.uk/Cracker/MD5 |
我们为什么要使用JSON Web Tokens?Simple Web Tokens(SWT)和 Security Assertion Markup Language Tokens(SAML)也是两种token方式,我们来讨论下JSON Web Tokens(JWT)的好处。 JSON比XML更简洁,它编码以后会更小,JWT比SAML更简洁。这使得JWT成为一种HTML和HTTP环境下的很好的传输选择。 SWT可以通过HMAC算法用共享密码做对称签名。然而,JWT和SAML token用公共/私密X.509键值对格式。在和签名JSON做对比时,没有引入模糊的安全漏洞的对XML做XML数字签名是非常困难的。 JSON parsers在大多数程序语言中都是可用的,因为它们直接映射成objects。相反地,XML没有自然文档-对象映射。所以用JWT比SAML更好。 JWT在互联网上广泛应用。所以再多个平台尤其是移动端上处理JWT是非常方便的。 JWT比SAML又短又清晰 |
https://jwt.io/introduction/
The text was updated successfully, but these errors were encountered: