Rumah  >  Artikel  >  hujung hadapan web  >  Analisis mendalam tentang prinsip dan penggunaan JWT (JSON Web Token)

Analisis mendalam tentang prinsip dan penggunaan JWT (JSON Web Token)

藏色散人
藏色散人ke hadapan
2023-01-10 10:55:211818semak imbas

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.

Analisis mendalam tentang prinsip dan penggunaan JWT (JSON Web Token)

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.

Analisis mendalam tentang prinsip dan penggunaan JWT (JSON Web Token)

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

Analisis mendalam tentang prinsip dan penggunaan JWT (JSON Web Token)

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!

Kenyataan:
Artikel ini dikembalikan pada:码农编程进阶笔记. Jika ada pelanggaran, sila hubungi admin@php.cn Padam