Berbasiskan cookie vs. Sesi vs otentikasi berbasis Token vs Berbasis klaim

25

Saya telah membaca tentang otentikasi dan menjadi bingung tentang klasifikasi jenis.

Mari kita mulai dari otentikasi berbasis Cookie, Jika saya memahaminya dengan benar, kuncinya adalah bahwa semua data, yang diperlukan untuk otentikasi pengguna, disimpan dalam cookie. Dan ini adalah kebingungan pertama saya: di cookie kami dapat menyimpan

  • sesi id dan jadi itu menjadi otentikasi berbasis Sesi?
  • klaim, dan haruskah itu disebut sebagai otentikasi berbasis Klaim?
  • Saya telah menemukan bahwa beberapa orang bahkan menyimpan token JWT dalam cookie, tetapi ini tampaknya seperti implementasi kustom dari auth flow sendiri ...

Sekarang mari kita beralih ke otentikasi berbasis Klaim. Elemen utamanya adalah klaim dan koleksi klaim bisa digunakan sebagai wadah

  • cookie (seperti dibahas di atas)
  • token (JWT sebagai contoh).

Dari sisi lain, ketika kita berbicara tentang token, mungkin berisi segala jenis informasi ... Session Id misalnya ...

Jadi apa yang telah saya lewatkan? Mengapa orang tidak mendefinisikan sesuatu seperti Cookie-Session-basedatau Token-Claims-basedotentikasi ketika berbicara tentang tipe otentikasi?

Set
sumber

Jawaban:

38

Saya setuju bahwa penamaan konsep yang berbeda membingungkan. Ketika berbicara tentang otentikasi dalam konteks web, ada beberapa aspek yang perlu dipertimbangkan.

Informasi apa yang dikirim klien ketika mengotentikasi?

  • Id sesi . Ini berarti bahwa server memiliki penyimpanan sesi yang berisi sesi aktif. Sesi stateful di sisi server.
  • Serangkaian klaim . Klaim berisi informasi tentang operasi apa yang dapat dilakukan klien. Server tidak melacak setiap klien yang diautentikasi, tetapi mempercayai klaim. Klaim biasanya tidak bernegara di sisi server.

Bagaimana klien mengirim informasi otentikasi?

  • Cookies . Browser mengirim cookie secara otomatis dengan setiap permintaan, setelah cookie ditetapkan. Cookie rentan terhadap XSRF.
  • Header lainnya . Biasanya, tajuk Otorisasi digunakan untuk ini. Header ini tidak dikirim oleh browser secara otomatis, tetapi harus ditetapkan oleh klien. Ini rentan terhadap XSS.
  • Minta Url . Informasi otentikasi termasuk dalam URL. Ini tidak umum digunakan.

Apa format informasi otentikasi?

  • Teks polos dan tidak ditandatangani . Ini dapat digunakan untuk id sesi. Id sesi umumnya tidak dapat ditebak oleh klien, sehingga server dapat mempercayai bahwa klien belum memalsunya.
  • Json Web Token . JWT ditandatangani secara kriptografis dan berisi informasi kedaluwarsa. Klien biasanya dapat mendekode token, tetapi tidak dapat mengubahnya tanpa pemberitahuan server.
  • Format lain yang ditandatangani . Sama seperti JWT. Yang penting adalah tanda tangan kriptografi, yang mencegah klien dari mengubah data.

Bonus: Bagaimana klien menyimpan informasi secara lokal

  • Cookies . Ini tentu saja terjadi ketika menggunakan cookie untuk mengirimkan informasi. Tetapi Cookie juga dapat digunakan hanya sebagai mekanisme penyimpanan sisi klien. Ini membutuhkan cookie agar dapat dibaca dari skrip agar bermanfaat. Misalnya, klien dapat membaca cookie dengan JavaScript dan mengirim informasi dengan Header Otorisasi.
  • Penyimpanan Lokal . Ini sering merupakan satu-satunya metode yang mungkin, jika cookie tidak tersedia. Membutuhkan manajemen dengan JavaScript.

Apa yang orang maksud saat mereka berkata ...

  • "Otentikasi berbasis cookie" . Saya menemukan bahwa ini biasanya berarti "Sesi id, kirim dengan cookie, mungkin sebagai teks biasa."
  • "Otentikasi berbasis Token" . Biasanya ini berarti "Klaim, kirim menggunakan tajuk otentikasi, disandikan sebagai Json Web Token."
  • "Otentikasi berbasis klaim" . Bisa jadi apa pun kecuali id ​​sesi.
TheFogger
sumber
1
Ringkasan yang luar biasa! Satu hal yang perlu diperhatikan ... Semua ini juga rentan terhadap serangan tengah di mana pihak ketiga dapat membajak informasi cookie / header, jadi pastikan untuk mengirim semua lalu lintas melalui HTTPS.
Brandon
3

Sederhananya,

  1. Otentikasi Berbasis Cookie

    • Klien-web (mis: browser-web) menyimpan cookie yang dikirim oleh server-web setelah otentikasi berhasil.
    • Cookie berisi info tentang pengguna, klien, stempel waktu authN, dan data bermanfaat lainnya dengan id unik untuk menentukan cookie.
    • Biasanya, cookie dienkripsi oleh server-web dengan set atribut domain (mis .:) google.comdan mengirimkannya ke klien-web.
    • Kapan pun klien web ingin mengakses sumber daya domain (mis .:) mail.google.com, ia akan mengirim semua cookie berdasarkan domainnya (mis .:) google.comke server-web, yang memvalidasi / memverifikasi dan memberikan / menolak akses berdasarkan status dan stempel waktu dari cookie.
  2. Otentikasi Berbasis Sesi

    • Bersamaan dengan cookie klien-web, jika server-web menyimpan data authN pengguna di back-end mereka, maka itu akan disebut otentikasi berbasis Sesi.
    • Ini sangat berguna jika terjadi pelanggaran bahwa web-klien mendapatkan akses ke sistem di mana ia seharusnya tidak mendapatkan akses, maka dari back-end, sesi web-klien dapat dicabut oleh admin.
  3. Otentikasi Berbasis Token

    • Umumnya ini digunakan dalam skenario non-klien web, di mana tidak ada cara untuk menyimpan cookie di sisi klien.
    • Oleh karena itu, server web mengirimkan token yang ditandatangani (berisi info tentang pengguna, klien, stempel waktu authN, dan data bermanfaat lainnya dengan id unik) ke klien setelah otentikasi berhasil.
    • Setiap kali, klien ingin mengakses sumber daya, ia harus mengirim token ini dan web-server memvalidasi / memverifikasi token sebelum mengizinkan untuk mengakses sumber daya.
  4. Otentikasi Berbasis Klaim

    • Ini sama dengan otentikasi berbasis token, hanya saja ia menambahkan lebih banyak data ke dalam token tentang klien dan / atau pengguna yang terkait dengan klien.
    • Data ini berkaitan dengan otorisasi, yang berbicara tentang apa yang harus dilakukan klien dalam sumber daya (misalnya: mail.read, mail.delete, calendar.read).
Zeigeist
sumber