Saya baru saja membaca artikel ini yang berumur beberapa tahun tetapi menjelaskan cara cerdas untuk mengamankan API REST Anda. Pada dasarnya:
- Setiap klien memiliki pasangan kunci publik / pribadi yang unik
- Hanya klien dan server yang mengetahui kunci pribadi; itu tidak pernah dikirim melalui kawat
- Dengan setiap permintaan, klien mengambil beberapa input (seluruh permintaan itu sendiri, cap waktu saat ini, dan kunci pribadi) dan menjalankannya melalui fungsi HMAC untuk menghasilkan hash dari permintaan
- Klien kemudian mengirimkan permintaan normal (yang berisi kunci publik) dan hash ke server
- Server mencari kunci pribadi klien (berdasarkan kunci publik yang disediakan) dan melakukan beberapa pemeriksaan stempel waktu (yang memang saya tidak mengerti) yang memverifikasi permintaan itu bukan korban dari serangan replay
- Jika semuanya baik-baik saja, maka server menggunakan kunci pribadi dan fungsi HMAC yang sama untuk menghasilkan hash sendiri dari permintaan
- Server kemudian membandingkan kedua hash (yang dikirim oleh klien dan juga hash yang dihasilkannya); jika cocok, permintaan diautentikasi dan diizinkan untuk melanjutkan
Saya kemudian menemukan JWT , yang terdengar sangat mirip. Namun artikel pertama tidak menyebutkan JWT sama sekali, dan jadi saya bertanya-tanya apakah JWT berbeda dari solusi auth di atas, dan jika demikian, bagaimana.
Jawaban:
Mari kita mulai dengan jawaban yang sangat mendasar.
JWT (seperti yang digunakan dalam konteks OAuth dan OpenID) tidak memerlukan rahasia bersama antara klien dan API. Ada 3 komponen dan pasangan 2 berbagi masing-masing rahasia: klien <-> server identifikasi, server identifikasi <-> API.
Ini memindahkan sebagian besar kompleksitas dari API ke server identifikasi, API hanya perlu memeriksa bahwa token dikeluarkan oleh server identifikasi dan tidak marah. Untuk memverifikasi bahwa API memeriksa bahwa tanda tangan JWT valid dengan rahasia tunggal yang diketahui bersama antara server identifikasi dan API. Itu dia!
Bagaimana server identifikasi memvalidasi identitas pengguna dapat sangat bervariasi (dalam banyak kasus itu adalah pasangan nama pengguna + kata sandi lama melalui koneksi TLS), tetapi tidak berpengaruh pada API Anda.
Privasi dan keamanan pesan dan token itu sendiri ketika menggunakan JWT ditangani oleh TLS, JWT tidak mengetahui masalah tersebut.
sumber