首页 > 后端开发 > Python教程 > 身份验证和授权 - 正确的方法!

身份验证和授权 - 正确的方法!

Mary-Kate Olsen
发布: 2024-10-09 06:14:29
原创
812 人浏览过

Authentication and Authorization - the correct way!

Bayangkan anda sedang membina web atau apl mudah alih yang perlu mengesahkan pengguna — mungkin untuk platform media sosial, tapak e-dagang atau malah papan pemuka yang ringkas. Pada satu ketika, anda akan bertanya kepada diri sendiri, "Bagaimanakah cara untuk memastikan pengguna saya log masuk dengan selamat?"

Di situlah pengesahan dimainkan. Tetapi dengan begitu banyak kaedah berbeza untuk dipilih — seperti pengurusan sesi, token pengesahan dan JWT (Token Web JSON) yang semakin popular — mungkin tidak begitu jelas untuk mengetahui yang mana satu sesuai untuk apl anda. Jadi bagaimana anda membuat keputusan?

Jika anda telah mendengar banyak tentang JWT dan tertanya-tanya sama ada ia berbaloi dengan gembar-gembur, anda berada di tempat yang betul. Dalam catatan blog ini, kami akan memecahkan apa itu JWT, cara ia berfungsi dan cara ia bertindan berbanding kaedah pengesahan biasa yang lain dalam Django. Pada akhirnya, anda akan mempunyai pemahaman yang jelas tentang masa untuk menggunakan JWT dan cara ia dibandingkan dengan pilihan lain seperti pengesahan berasaskan sesi dan token pengesahan. Mari selami!

Apakah itu JWT (Token Web JSON)?

JWT (JSON Web Token) ialah format token yang padat dan selamat URL yang digunakan untuk menghantar maklumat dengan selamat antara pihak. Ia biasanya digunakan dalam proses pengesahan di mana pelanggan meminta akses kepada sumber, seperti dalam web atau aplikasi mudah alih.

JWT terdiri daripada tiga bahagian:

Pengepala: Mengandungi metadata tentang token, seperti jenis (JWT) dan algoritma tandatangan (mis., HS256).

Muat bayar: Mengandungi tuntutan khusus pengguna, seperti ID pengguna, nama pengguna atau peranan.

Tandatangan: Memastikan token tidak diganggu dengan menandatangani pengepala dan muatan dengan kunci rahsia.

Sampel JWT mungkin kelihatan seperti ini:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImpvaG4iLCJleHAiOjE2MjEyMzY5MjZ9.GG7h8oV2C7Mcp93JK...
登录后复制

JWT biasanya digunakan dalam pengesahan tanpa negara, bermakna pelayan tidak menyimpan data sesi. Sebaliknya, semua maklumat (tuntutan) yang diperlukan dibenamkan dalam token itu sendiri.

Cara JWT Berfungsi: Proses Langkah demi Langkah

Mari kita pecahkan cara pengesahan JWT berfungsi dengan senario mudah:

1. Log Masuk Pengguna
Seorang pengguna menghantar e-mel dan kata laluan mereka melalui borang log masuk. Pelayan mengesahkan bukti kelayakan, dan jika ia betul, pelayan menjana JWT yang mengandungi maklumat pengguna (seperti id, nama pengguna dan peranan mereka).

2. Token Dihantar kepada Pelanggan
Sebaik sahaja JWT dijana, ia dihantar semula kepada pelanggan, biasanya dalam badan tindak balas. Pelanggan menyimpan token ini (dalam localStorage atau sessionStorage untuk penyemak imbas, atau dengan selamat pada peranti mudah alih).

3. Pengguna Meminta Sumber Dilindungi
Setiap kali pelanggan perlu mengakses laluan yang dilindungi, ia menghantar JWT dalam pengepala Kebenaran permintaan:

Authorization: Bearer <JWT_TOKEN>

登录后复制

Pelayan kemudiannya mengesahkan token, memastikan kesahihan dan integritinya, sebelum memberikan akses kepada sumber.

4. Tamat Tempoh dan Segarkan Token
Memandangkan token JWT mempunyai masa tamat tempoh (mis., 5 minit), setelah tamat tempoh, pengguna boleh menghantar token muat semula untuk mendapatkan JWT baharu tanpa perlu log masuk semula.

5. Pengguna Log Keluar
Apabila pengguna log keluar, token muat semula biasanya disenaraihitamkan (dalam persediaan yang menyokong penyenaraian hitam), memastikan pengguna log keluar dengan berkesan dan tidak boleh memuat semula token itu lagi.

JWT lwn Kaedah Pengesahan Tradisional dalam Django

JWT ialah salah satu daripada banyak cara untuk melaksanakan pengesahan dalam aplikasi Django. Mari kita lihat bagaimana JWT dibandingkan dengan kaedah biasa lain seperti pengurusan sesi dan token pengesahan.

1. Pengesahan JWT lwn Pengurusan Sesi

Pengurusan Sesi:
Dalam pengesahan berasaskan sesi, sebaik sahaja pengguna log masuk, pelayan mencipta sesi dan menyimpannya dalam pangkalan data atau memori. ID sesi kemudiannya dihantar kepada pelanggan melalui kuki. Pelanggan menyimpan ID sesi dan menghantarnya dengan setiap permintaan. Pelayan kemudiannya mendapatkan semula data sesi daripada storan untuk mengenal pasti pengguna.

Senario Dunia Sebenar:

Tapak Web E-dagang: Bayangkan anda log masuk ke kedai dalam talian, tambah item pada troli anda dan teruskan untuk membuat pembayaran. Setiap tindakan semasa sesi ini, seperti melihat produk atau mengemas kini troli, terikat pada ID sesi anda yang disimpan pada pelayan. Sebaik sahaja anda log keluar, sesi itu dimusnahkan.

JWT lwn. Sesi:

- Storan:

  • JWT : sans état, pas de stockage côté serveur. Toutes les données sont contenues dans le jeton lui-même.
  • Sessions : avec état, le serveur stocke les données de session (généralement dans une base de données ou une mémoire) et un identifiant de session est envoyé au client.

- Évolutivité :

  • JWT : hautement évolutif ; pas besoin de stocker les informations de session utilisateur, ce qui facilite l'évolution horizontale sur les serveurs.
  • Sessions : moins évolutives ; nécessite la gestion et le partage des données de session entre les serveurs (par exemple, en utilisant un magasin de sessions centralisé).

- Transfert de données :

  • JWT : le jeton inclut toutes les données utilisateur (réclamations) et est envoyé avec chaque demande. Il peut devenir volumineux si trop de données sont incluses.
  • Sessions : seul un identifiant de session est envoyé et les données utilisateur sont récupérées du serveur.

- Sécurité :

  • JWT : vulnérable si les jetons ne sont pas stockés de manière sécurisée sur le client (par exemple, stockage local). Il est important de gérer l’expiration et l’actualisation des jetons en toute sécurité.
  • Sessions : utilise généralement des cookies pour stocker l'ID de session, qui sont plus sécurisés si les indicateurs HTTP uniquement et sécurisés sont utilisés. Cependant, il peut être vulnérable aux attaques CSRF.

- Expiration & Gestion :

  • JWT : les jetons ont un délai d'expiration. Si un jeton d'actualisation est utilisé, le jeton d'accès peut être renouvelé sans ré-authentification.
  • Sessions : les sessions ont également un délai d'attente, mais peuvent facilement être prolongées tant que l'utilisateur interagit avec l'application.

- Taille du jeton :

  • JWT : étant donné que toutes les données sont incluses dans le jeton, les JWT peuvent être plus volumineux, surtout s'ils contiennent de nombreuses informations utilisateur ou métadonnées.
  • Sessions : seul l'ID de session est envoyé à chaque demande, le transfert de données est donc minime.

- Utilisation :

  • JWT : préféré dans les API modernes et sans état, les applications à page unique (SPA) et les applications mobiles.
  • Sessions : courantes dans les applications Web traditionnelles où le serveur gère l'état de l'utilisateur.

2. Authentification JWT et jetons d'authentification

Jetons d'authentification :
Dans l'authentification basée sur un jeton (comme l'authentification par jeton intégrée de Django), le serveur génère un jeton unique lorsque l'utilisateur se connecte. Ce jeton est stocké sur le serveur et envoyé au client, qui l'inclut dans chaque requête. Le serveur vérifie le jeton dans la base de données pour vérifier l'utilisateur.

Scénario du monde réel :

Accès API : Un fournisseur d'API (comme GitHub) génère un jeton API pour les utilisateurs après la connexion. Chaque fois que vous interagissez avec l'API GitHub, le jeton est transmis dans les en-têtes de la demande pour authentifier la demande. .

JWT contre jetons d'authentification :

- Stockage de jetons

JWT (jeton Web JSON) :

Apatride : les JWT sont autonomes, ce qui signifie que toutes les informations nécessaires (réclamations) sont stockées dans le jeton lui-même. Le serveur ne stocke pas le jeton, ce qui en fait un système sans état.
Le jeton est généralement stocké côté client (par exemple, dans localStorage, sessionStorage ou cookies) et envoyé avec chaque demande dans l'en-tête Authorization.

Jetons d'authentification :

Stateful : dans l'authentification traditionnelle basée sur un jeton, le jeton est généré et stocké côté serveur (souvent dans une base de données). Le serveur garde une trace du jeton et le client l'inclut dans chaque requête (généralement dans les en-têtes).

- Structure des jetons

JWT :

Autonomes : les jetons JWT se composent de trois parties : l'en-tête, la charge utile et la signature. La charge utile contient des informations utilisateur (telles que l'identifiant, l'adresse e-mail, le rôle) et est signée pour garantir l'intégrité.

Jetons d'authentification :

Jetons opaques : les jetons d'authentification sont généralement des chaînes opaques, ce qui signifie qu'ils ne contiennent aucune information utilisateur. Ils agissent comme une référence à la session côté serveur ou aux données utilisateur.
Le serveur utilise ce jeton pour rechercher les informations de session ou d'utilisateur stockées sur le serveur.

- Stockage et évolutivité du serveur

JWT :

Pas de stockage sur le serveur : étant donné que les jetons JWT sont autonomes, le serveur n'a pas besoin de stocker les données de session ou de jeton. Cela le rend hautement évolutif, en particulier dans les systèmes distribués ou les architectures de microservices, où plusieurs serveurs peuvent être impliqués.

Jetons d'authentification :

Stockage côté serveur : les jetons d'authentification sont stockés dans une base de données ou dans la mémoire du serveur, ce qui signifie que le serveur doit suivre et valider le jeton pour chaque demande. Cela peut être moins évolutif puisque le serveur doit accéder à un magasin de sessions central pour chaque demande.

- Considérations de sécurité

JWT :

서명 기반: JWT 토큰은 HS256 또는 RS256과 같은 알고리즘을 사용하여 서명되어 토큰이 변조되지 않았는지 확인합니다. 이는 토큰의 무결성을 보호하지만 데이터를 암호화하지는 않습니다. 암호화되지 않은 민감한 데이터는 페이로드에 포함되어서는 안 됩니다.

클라이언트 측 위험: JWT는 종종 localStorage 또는 sessionStorage에 저장되므로 XSS(교차 사이트 스크립팅) 공격에 취약해질 수 있습니다. 이를 완화하기 위해 HTTP 전용 쿠키에 저장할 수 있습니다.

인증 토큰:

서버 측 검증: 인증 토큰은 사용자 정보를 포함하지 않고 서버 세션에 대해 검증되므로 변조로부터 더 안전한 것으로 간주될 수 있습니다. 그러나 제대로 처리되지 않을 경우 세션 하이재킹이나 CSRF(Cross-Site Request Forgery) 공격에 취약합니다.

- 만료 및 토큰 수명

JWT:

단기 액세스 토큰: JWT는 일반적으로 수명이 짧습니다(예: 5~15분). 만료되면 클라이언트는 새로 고침 토큰을 사용하여 새 액세스 토큰을 받아야 합니다. 이는 JWT 보안 모델의 핵심 부분입니다.
새로 고침 토큰: 수명이 긴 새로 고침 토큰을 사용하면 사용자는 계속해서 자격 증명을 다시 입력하지 않고도 로그인 상태를 유지할 수 있지만 보안 문제도 발생합니다(예: 안전하게 저장 및 관리해야 함).

인증 토큰:

기본적으로 토큰 만료 없음: 인증 토큰은 서버에서 명시적으로 처리하지 않는 한 기본적으로 만료되지 않습니다. 서버는 토큰을 취소하거나 만료할 수 있지만, 이를 위해서는 토큰 만료를 추적하기 위한 추가 논리와 저장소가 필요합니다.

- 토큰 크기

JWT:

더 큰 토큰 크기: JWT에는 사용자 정보(클레임)와 서명이 포함되어 있으므로 불투명 인증 토큰에 비해 더 큰 경향이 있습니다. 특히 요청이 자주 발생하는 시나리오에서는 대역폭 사용량이 약간 증가할 수 있습니다.

인증 토큰:

작은 토큰 크기: 인증 토큰은 일반적으로 불투명한 문자열이므로 크기가 훨씬 작습니다. 식별자 역할을 하며 추가 데이터를 전달하지 않으므로 대역폭을 덜 사용합니다.

- 사용 시나리오 예시

JWT:

단일 페이지 애플리케이션(SPA): JWT는 상태 비저장 인증이 필요하고 서버 측 세션 관리가 필요하지 않은 SPA(예: React 또는 Angular)와 잘 작동합니다.

마이크로서비스 및 API: JWT는 여러 서비스가 서버 간에 세션 상태를 공유하지 않고 사용자를 인증해야 하는 API 및 마이크로서비스 아키텍처에 이상적입니다.
인증 토큰:

기존 웹 앱: 서버 렌더링 웹 애플리케이션에서는 인증 토큰(또는 세션)이 서버 측에 저장되고 검증되므로 일반적으로 사용되므로 세션 유지 관리가 쉬운 애플리케이션에 적합합니다.
소규모 애플리케이션: 인증 토큰은 세션 관리가 확장성 문제가 되지 않는 사용자 수가 적은 애플리케이션에 적합합니다.

- 무국적 vs. 상태 유지

JWT:

상태 비저장: JWT에는 서버 측 저장소가 필요하지 않으므로 애플리케이션을 상태 비저장으로 만듭니다. 이는 서버 간 세션 동기화가 필요하지 않기 때문에 여러 서버에 걸쳐 수평적으로 확장하는 데 유용합니다.
인증 토큰:

상태 저장: 인증 토큰에는 서버 측 세션 저장소가 필요합니다. 즉, 서버가 세션 데이터를 추적합니다. 이는 소규모 애플리케이션에는 괜찮지만 중앙 세션 저장소(예: Redis)를 사용하지 않는 한 여러 서버로 확장할 때 문제가 될 수 있습니다.

- 블랙리스트 및 철회

JWT:

해지 어려움: JWT는 상태 비저장이고 서버에 저장되지 않기 때문에 토큰 블랙리스트를 사용하지 않는 한 일단 발급되면 취소하기가 어렵습니다. 즉, 토큰이 손상되더라도 만료될 때까지 유효한 상태로 유지됩니다.

블랙리스트 필수: 토큰 취소(예: 로그아웃 시)를 처리하려면 서버에서 블랙리스트 메커니즘을 구현하여 무효화된 토큰을 추적해야 합니다.

인증 토큰:

쉬운 취소: 인증 토큰은 서버에 저장되므로 취소하거나 무효화하는 것이 간단합니다.

3. JWT 인증과 기본 인증 비교

기본 인증:
기본 인증에서 클라이언트는 일반적으로 base64로 인코딩된 모든 요청과 함께 사용자의 자격 증명(사용자 이름 및 비밀번호)을 보냅니다. 이 방법은 내부 시스템이나 간단한 설정에서 자주 사용됩니다.

실제 시나리오:

내부 관리 대시보드: 소규모 회사의 내부 관리 대시보드에서는 사용자가 기본 인증으로 로그인해야 합니다. 사용자가 페이지에 액세스하면 해당 자격 증명이 요청에 포함되어 전송됩니다.

现实世界用例:何时使用 JWT?

让我们考虑一个现实世界的示例:一个社交媒体平台,用户可以在其中登录、与帖子互动以及跨多个设备管理他们的个人资料。

在这样的系统中:

  1. JWT 工作得很好,因为它是无状态的,这意味着服务器不需要存储用户会话。
  2. 客户端可以在本地存储令牌,这允许用户在不同的选项卡和设备上保持登录状态。
  3. 由于应用程序可以跨多个服务器水平扩展(例如,一台服务器用于处理帖子,另一台服务器用于配置文件),因此使用 JWT 可以更轻松地扩展,而无需中央会话存储。
  4. 用户还可以定期刷新其令牌以保持访问权限,而无需再次登录。

结论:选择哪种身份验证方法?

选择正确的身份验证方法取决于您的应用程序的要求:

JWT 非常适合无状态、可扩展的应用程序(例如 SPA、移动应用和微服务)。
基于会话的身份验证非常适合传统 Web 应用程序,其中可扩展性不是主要问题。
身份验证令牌是一种简单、安全的方法,用于小规模 API 身份验证,其中服务器端令牌存储是可管理的。

每种方法都有其优点和缺点,但 JWT 因其处理现代分布式系统的能力而脱颖而出,其中可扩展性和灵活性是关键。

以上是身份验证和授权 - 正确的方法!的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板