Artikel ini membawakan anda pengetahuan yang berkaitan tentang JWT. Ia terutamanya memperkenalkan apa itu JWT? Apakah prinsip dan penggunaan JWT? Bagi yang berminat, mari kita lihat di bawah ini semoga bermanfaat untuk semua.
JSON Web Token
(disingkatkan sebagai JWT) kini merupakan penyelesaian pengesahan merentas domain yang paling popular Artikel ini memperkenalkan prinsip dan penggunaannya.
1. Isu dengan pengesahan merentas domain
Perkhidmatan Internet tidak dapat dipisahkan daripada pengesahan pengguna. Proses umum adalah seperti berikut.
1. Pengguna menghantar nama pengguna dan kata laluan ke pelayan.
2. Selepas pengesahan pelayan diluluskan, data yang berkaitan, seperti peranan pengguna, masa log masuk, dsb., akan disimpan dalam sesi semasa.
3. Pelayan mengembalikan session_id kepada pengguna dan menulisnya ke dalam Kuki pengguna.
4. Setiap permintaan seterusnya oleh pengguna akan menghantar session_id kembali ke pelayan melalui Cookie.
5. Pelayan menerima session_id, mencari data yang disimpan sebelum ini, dan dengan itu mengetahui identiti pengguna.
Masalah model ini ialah ia tidak berskala dengan baik. Sudah tentu, tiada masalah dengan mesin tunggal Jika ia adalah kluster pelayan atau seni bina berorientasikan perkhidmatan merentas domain, perkongsian data sesi diperlukan dan setiap pelayan boleh membaca sesi.
Sebagai contoh, tapak web A dan tapak web B adalah perkhidmatan berkaitan syarikat yang sama. Sekarang adalah dikehendaki selagi pengguna log masuk ke salah satu laman web, dia akan log masuk secara automatik apabila dia melawat laman web lain Bagaimana ini boleh dicapai?
Satu penyelesaian adalah untuk meneruskan data sesi dan menulisnya ke pangkalan data atau lapisan kegigihan lain. Selepas menerima permintaan, pelbagai perkhidmatan meminta data daripada lapisan kegigihan. Kelebihan penyelesaian ini ialah strukturnya jelas, tetapi kelemahannya ialah jumlah kerja yang agak besar. Di samping itu, jika lapisan kegigihan gagal, ia akan menjadi satu titik kegagalan.
Penyelesaian lain ialah pelayan tidak menyimpan data sesi Semua data disimpan pada klien dan dihantar semula ke pelayan untuk setiap permintaan. JWT ialah wakil penyelesaian ini.
2. Prinsip JWT
Prinsip JWT ialah selepas pelayan mengesahkan, ia menghasilkan objek JSON dan menghantarnya kembali kepada pengguna, seperti yang ditunjukkan di bawah.
{ "姓名": "张三", "角色": "管理员", "到期时间": "2018年7月1日0点0分" }
Pada masa hadapan, apabila pengguna berkomunikasi dengan pelayan, objek JSON ini akan dihantar semula. Pelayan bergantung semata-mata pada objek ini untuk mengenal pasti pengguna. Untuk mengelakkan pengguna daripada mengganggu data, pelayan akan menambah tandatangan semasa menjana objek ini (lihat di bawah untuk butiran).
Pelayan tidak menyimpan sebarang data sesi Dengan kata lain, pelayan menjadi tidak berstatus, menjadikannya lebih mudah untuk dikembangkan.
3. Struktur data JWT
JWT sebenar mungkin seperti berikut.
Ia adalah rentetan yang sangat panjang yang dipisahkan kepada tiga bahagian dengan titik (.) di tengah. Ambil perhatian bahawa tiada pemisah baris di dalam JWT Ia ditulis dalam beberapa baris hanya untuk kemudahan paparan.
Tiga bahagian JWT adalah seperti berikut.
Pengepala
Muatan Muatan
Tandatangan
ditulis dalam satu baris, seperti yang ditunjukkan di bawah.
Header.Payload.Signature
Yang berikut akan memperkenalkan ketiga-tiga bahagian ini secara bergilir-gilir.
3.1 Pengepala
Bahagian Pengepala ialah objek JSON yang menerangkan metadata JWT, biasanya seperti berikut.
{ "alg": "HS256", "typ": "JWT" }
Dalam kod di atas, atribut alg mewakili algoritma tandatangan (algoritma), lalai ialah HMAC SHA256 (ditulis sebagai HS256) atribut taip mewakili jenis token (token), JWT token Ditulis secara seragam sebagai JWT.
Akhir sekali, tukar objek JSON di atas menjadi rentetan menggunakan algoritma Base64URL (lihat di bawah untuk butiran).
3.2 Muatan
Bahagian Muatan juga merupakan objek JSON, digunakan untuk menyimpan data sebenar yang perlu dipindahkan. JWT menentukan 7 medan rasmi untuk pemilihan.
iss (pengeluar): penerbit
tamat (masa tamat tempoh): masa tamat tempoh
sub (subjek): subjek
aud (penonton): penonton
nbf (Bukan Sebelum): masa berkesan
iat (Dikeluarkan Pada): Masa pengeluaran
jti (ID JWT): Nombor
Sebagai tambahan kepada rasmi medan, Anda juga boleh menentukan medan peribadi dalam bahagian ini, berikut ialah contoh.
{ "sub": "1234567890", "name": "John Doe", "admin": true }
Perhatikan bahawa JWT tidak disulitkan secara lalai dan boleh dibaca oleh sesiapa sahaja, jadi jangan letak maklumat rahsia dalam bahagian ini.
Objek JSON ini juga mesti ditukar kepada rentetan menggunakan algoritma Base64URL.
3.3 Tandatangan
Bahagian Tandatangan ialah tandatangan dua bahagian pertama untuk mengelakkan gangguan data.
Pertama, anda perlu nyatakan rahsia. Kunci ini hanya diketahui oleh pelayan dan tidak boleh dibocorkan kepada pengguna. Kemudian, gunakan algoritma tandatangan yang dinyatakan dalam Pengepala (lalai ialah HMAC SHA256) untuk menjana tandatangan mengikut formula berikut.
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
算出签名以后,把 Header、Payload、Signature 三个部分拼成一个字符串,每个部分之间用"点"(.)分隔,就可以返回给用户。
3.4 Base64URL
前面提到,Header 和 Payload 串型化的算法是 Base64URL。这个算法跟 Base64 算法基本类似,但有一些小的不同。
JWT 作为一个令牌(token),有些场合可能会放到 URL(比如 api.example.com/?token=xxx)。Base64 有三个字符+、/和=,在 URL 里面有特殊含义,所以要被替换掉:=被省略、+替换成-,/替换成_ 。这就是 Base64URL 算法。
四、JWT 的使用方式
客户端收到服务器返回的 JWT,可以储存在 Cookie 里面,也可以储存在 localStorage。
此后,客户端每次与服务器通信,都要带上这个 JWT。你可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP 请求的头信息Authorization字段里面。
Authorization: Bearer <token>
另一种做法是,跨域的时候,JWT 就放在 POST 请求的数据体里面。
五、JWT 的几个特点
(1)JWT 默认是不加密,但也是可以加密的。生成原始 Token 以后,可以用密钥再加密一次。
(2)JWT 不加密的情况下,不能将秘密数据写入 JWT。
(3)JWT 不仅可以用于认证,也可以用于交换信息。有效使用 JWT,可以降低服务器查询数据库的次数。
(4)JWT 的最大缺点是,由于服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。
(5)JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证。
(6)为了减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输。
推荐学习:《JavaScript视频教程》
Atas ialah kandungan terperinci Analisis mendalam tentang prinsip dan penggunaan JWT (JSON Web Token). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!