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

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

Jan 10, 2023 am 10:55 AM
json jwt

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分"
}
Salin selepas log masuk

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
Salin selepas log masuk

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"
}
Salin selepas log masuk

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
}
Salin selepas log masuk

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)
Salin selepas log masuk

算出签名以后,把 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>
Salin selepas log masuk

另一种做法是,跨域的时候,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 Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Akan R.E.P.O. Ada Crossplay?
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Gabungan golang WebSocket dan JSON: merealisasikan penghantaran dan penghuraian data Gabungan golang WebSocket dan JSON: merealisasikan penghantaran dan penghuraian data Dec 17, 2023 pm 03:06 PM

Gabungan golangWebSocket dan JSON: merealisasikan penghantaran dan penghuraian data Dalam pembangunan Web moden, penghantaran data masa nyata menjadi semakin penting. WebSocket ialah protokol yang digunakan untuk mencapai komunikasi dua hala Tidak seperti model respons permintaan HTTP tradisional, WebSocket membenarkan pelayan untuk menolak data secara aktif kepada klien. JSON (JavaScriptObjectNotation) ialah format ringan untuk pertukaran data yang ringkas dan mudah dibaca.

Apakah perbezaan antara MySQL5.7 dan MySQL8.0? Apakah perbezaan antara MySQL5.7 dan MySQL8.0? Feb 19, 2024 am 11:21 AM

MySQL5.7 dan MySQL8.0 ialah dua versi pangkalan data MySQL yang berbeza Terdapat beberapa perbezaan utama antara mereka: Peningkatan prestasi: MySQL8.0 mempunyai beberapa peningkatan prestasi berbanding MySQL5.7. Ini termasuk pengoptimum pertanyaan yang lebih baik, penjanaan pelan pelaksanaan pertanyaan yang lebih cekap, algoritma pengindeksan yang lebih baik dan pertanyaan selari, dsb. Penambahbaikan ini boleh meningkatkan prestasi pertanyaan dan prestasi keseluruhan sistem. Sokongan JSON: MySQL 8.0 memperkenalkan sokongan asli untuk jenis data JSON, termasuk penyimpanan, pertanyaan dan pengindeksan data JSON. Ini menjadikan pemprosesan dan memanipulasi data JSON dalam MySQL lebih mudah dan cekap. Ciri transaksi: MySQL8.0 memperkenalkan beberapa ciri transaksi baharu, seperti atomic

Petua pengoptimuman prestasi untuk menukar tatasusunan PHP kepada JSON Petua pengoptimuman prestasi untuk menukar tatasusunan PHP kepada JSON May 04, 2024 pm 06:15 PM

Kaedah pengoptimuman prestasi untuk menukar tatasusunan PHP kepada JSON termasuk: menggunakan sambungan JSON dan fungsi json_encode() menambah pilihan JSON_UNESCAPED_UNICODE untuk mengelakkan aksara melarikan diri menggunakan penimbal untuk meningkatkan prestasi pengekodan JSON; Pustaka pengekodan JSON.

Cara mengendalikan format data XML dan JSON dalam pembangunan C# Cara mengendalikan format data XML dan JSON dalam pembangunan C# Oct 09, 2023 pm 06:15 PM

Cara mengendalikan format data XML dan JSON dalam pembangunan C# memerlukan contoh kod khusus Dalam pembangunan perisian moden, XML dan JSON ialah dua format data yang digunakan secara meluas. XML (Extensible Markup Language) ialah bahasa penanda yang digunakan untuk menyimpan dan menghantar data, manakala JSON (JavaScript Object Notation) ialah format pertukaran data yang ringan. Dalam pembangunan C#, kami selalunya perlu memproses dan mengendalikan data XML dan JSON Artikel ini akan memfokuskan pada cara menggunakan C# untuk memproses kedua-dua format data ini dan melampirkan

Gunakan fungsi json.MarshalIndent dalam golang untuk menukar struktur kepada rentetan JSON yang diformatkan Gunakan fungsi json.MarshalIndent dalam golang untuk menukar struktur kepada rentetan JSON yang diformatkan Nov 18, 2023 pm 01:59 PM

Gunakan fungsi json.MarshalIndent dalam golang untuk menukar struktur menjadi rentetan JSON yang diformatkan Apabila menulis program dalam Golang, kita selalunya perlu menukar struktur menjadi rentetan JSON Dalam proses ini, fungsi json.MarshalIndent boleh membantu kita output berformat. Di bawah ini kami akan menerangkan secara terperinci cara menggunakan fungsi ini dan memberikan contoh kod khusus. Mula-mula, mari buat struktur yang mengandungi beberapa data. Berikut adalah petunjuk

Tutorial penggunaan Panda: Permulaan pantas untuk membaca fail JSON Tutorial penggunaan Panda: Permulaan pantas untuk membaca fail JSON Jan 13, 2024 am 10:15 AM

Permulaan Pantas: Kaedah Pandas membaca fail JSON, contoh kod khusus diperlukan Pengenalan: Dalam bidang analisis data dan sains data, Pandas ialah salah satu perpustakaan Python yang penting. Ia menyediakan fungsi yang kaya dan struktur data yang fleksibel, serta boleh memproses dan menganalisis pelbagai data dengan mudah. Dalam aplikasi praktikal, kita sering menghadapi situasi di mana kita perlu membaca fail JSON. Artikel ini akan memperkenalkan cara menggunakan Panda untuk membaca fail JSON dan melampirkan contoh kod tertentu. 1. Pemasangan Panda

Bagaimanakah anotasi dalam perpustakaan Jackson mengawal pensirilan dan penyahsirilan JSON? Bagaimanakah anotasi dalam perpustakaan Jackson mengawal pensirilan dan penyahsirilan JSON? May 06, 2024 pm 10:09 PM

Anotasi dalam perpustakaan Jackson mengawal pensirilan dan penyahserilangan JSON: Pensirilan: @JsonIgnore: Abaikan harta @JsonProperty: Tentukan nama @JsonGetter: Gunakan kaedah get @JsonSetter: Gunakan kaedah yang ditetapkan Deserialization: @JsonIgnoreProperties: Abaikan harta @ JsonProperty: Nyatakan nama @JsonCreator: Gunakan pembina @JsonDeserialize: Logik tersuai

Gunakan fungsi json_encode() PHP untuk menukar tatasusunan atau objek kepada rentetan JSON dan memformatkan output Gunakan fungsi json_encode() PHP untuk menukar tatasusunan atau objek kepada rentetan JSON dan memformatkan output Nov 03, 2023 pm 03:44 PM

Menggunakan fungsi json_encode() PHP untuk menukar tatasusunan atau objek kepada rentetan JSON dan memformat output boleh memudahkan pemindahan dan pertukaran data antara platform dan bahasa yang berbeza. Artikel ini akan memperkenalkan penggunaan asas fungsi json_encode() dan cara memformat dan mengeluarkan rentetan JSON. 1. Penggunaan asas fungsi json_encode() Sintaks asas fungsi json_encode() adalah seperti berikut: stringjson_encod

See all articles