Pengekodan Selamat dan OWASP Top 10 untuk Bahagian Belakang · Pelajaran

Keselamatan dan Amalan Terbaik JWT

Terokai pertimbangan keselamatan JSON Web Tokens (JWT), termasuk penandatanganan, pengesahan dan penyimpanan yang betul untuk mencegah serangan lazim.

Pelajaran 3 daripada 412 langkah

Keselamatan dan Amalan Terbaik JWT ialah pelajaran Pengekodan Selamat dan OWASP Top 10 untuk Bahagian Belakang percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Pengekodan Selamat dan OWASP Top 10 untuk Bahagian Belakang, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Pengekodan Selamat dan OWASP Top 10 untuk Bahagian Belakang merangkumi sejumlah 4 pelajaran.

Pengenalan kepada Keselamatan JWT

Token Web JSON (JWT) popular untuk pengesahan dan pertukaran maklumat yang selamat antara pihak-pihak. Token ini padat dan serba lengkap.

Walau bagaimanapun, sifatnya yang serba lengkap bermakna keselamatan amat penting. Pengendalian atau pengesahan JWT yang tidak betul boleh menyebabkan kerentanan serius dalam aplikasi bahagian belakang anda.

Tinjauan Pantas: Struktur JWT

JWT terdiri daripada tiga bahagian yang dipisahkan oleh tanda titik:

  • Pengepala: Menentukan jenis token (JWT) dan algoritma tandatangan (contohnya, HS256, RS256).
  • Muatan: Mengandungi tuntutan – pernyataan tentang suatu entiti (seperti ID pengguna) dan data tambahan (seperti peranan dan masa tamat tempoh).
  • Tandatangan: Digunakan untuk mengesahkan integriti dan ketulenan token.

Ingat, muatan dikodkan (Base64Url), bukan disulitkan. Sesiapa sahaja boleh membaca tuntutan tersebut, jadi jangan letakkan data sensitif secara langsung dalam muatan.

Mengapakah JWT Ditandatangani?

Tandatangan ialah komponen keselamatan yang paling penting dalam JWT. Tandatangan dicipta dengan menggabungkan pengepala yang dikodkan, muatan yang dikodkan dan kunci rahsia (atau kunci persendirian untuk algoritma tidak simetri).

Tandatangan memberikan dua jaminan utama:

  • Integriti: Mengesahkan bahawa pengepala atau muatan token tidak diubah suai sejak token itu dikeluarkan.
  • Ketulenan: Mengesahkan bahawa token itu benar-benar dicipta oleh penghantar yang dijangka.

Tanpa tandatangan yang sah, token tidak boleh dipercayai walaupun tuntutannya kelihatan sah.

Menandatangani: Simetri berbanding Tidak Simetri

JWT boleh ditandatangani menggunakan pelbagai jenis algoritma kriptografi:

  • Simetri (contohnya, HS256): Menggunakan satu kunci rahsia yang dikongsi untuk penandatanganan dan pengesahan. Kaedah ini lebih pantas dan mudah, tetapi kedua-dua pengeluar dan pengesah mesti mengetahui kunci yang sama dengan selamat.
  • Tidak simetri (contohnya, RS256): Menggunakan kunci persendirian untuk penandatanganan dan kunci awam untuk pengesahan. Kaedah ini lebih kompleks, tetapi membolehkan pelbagai pihak mengesahkan token menggunakan kunci awam tanpa memerlukan akses kepada kunci persendirian yang sensitif.

Pilih algoritma berdasarkan keperluan keselamatan aplikasi anda dan keupayaan pengurusan kunci.

Menjana JWT yang Ditandatangani (HS256)

Berikut ialah contoh asas Java yang menunjukkan cara mencipta JWT yang ditandatangani dengan HS256 menggunakan pustaka umum. Beri perhatian kepada cara kunci rahsia digunakan.

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
import java.security.Key;

public class Main {
  public static void main(String[] args) {
    // A strong, unique secret key is crucial for security
    String secretString = "yourSuperSecretKeyThatIsVeryLongAndRandom12345!"; 
    byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(secretString);
    Key signingKey = new SecretKeySpec(apiKeySecretBytes, SignatureAlgorithm.HS256.getJcaName());

    String jwt = Jwts.builder()
        .setSubject("user123")
        .setIssuedAt(new Date(System.currentTimeMillis()))
        .setExpiration(new Date(System.currentTimeMillis() + 60 * 1000)) // 1 minute expiry
        .signWith(signingKey, SignatureAlgorithm.HS256)
        .compact();

    System.out.println("Generated JWT: " + jwt);
  }
}

Mengesahkan Tandatangan JWT

Apabila menerima JWT, bahagian belakang anda mesti sentiasa mengesahkan tandatangannya sebelum mempercayai mana-mana tuntutannya.

Proses pengesahan melibatkan pengiraan semula tandatangan menggunakan pengepala token, muatan dan kunci rahsia yang dijangka (atau kunci awam). Jika tandatangan yang dikira tidak sepadan dengan tandatangan yang terdapat dalam token, token itu telah diubah suai atau tidak dikeluarkan oleh sumber yang dipercayai.

Mana-mana token dengan tandatangan yang tidak sah mesti ditolak serta-merta!

Mengesahkan Tuntutan JWT

Selain pengesahan tandatangan, adalah penting untuk mengesahkan tuntutan dalam muatan JWT. Langkah ini membantu mencegah pelbagai serangan dan memastikan token digunakan dengan betul:

  • Tamat tempoh (exp): Periksa sama ada token telah tamat tempoh.
  • Belum sebelum (nbf): Pastikan token tidak digunakan sebelum masa pengaktifannya.
  • Dikeluarkan pada (iat): Kenal pasti masa token dikeluarkan.
  • Pengeluar (iss): Sahkan bahawa token berasal daripada entiti yang dipercayai.
  • Khalayak (aud): Sahkan bahawa token itu ditujukan untuk perkhidmatan atau aplikasi khusus anda.

Laksanakan pengesahan tuntutan yang ketat untuk mencegah serangan ulangan dan memastikan konteks penggunaan token yang betul.

Mengesahkan JWT (HS256)

Contoh Java ini menunjukkan cara mengesahkan JWT, termasuk memeriksa tandatangannya dan tuntutan umum seperti tamat tempoh. Contoh ini juga menunjukkan cara mengendalikan pengecualian umum.

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.MalformedJwtException;
import io.jsonwebtoken.SignatureException;
import io.jsonwebtoken.UnsupportedJwtException;
import java.util.Date;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
import java.security.Key;

public class Main {
  public static void main(String[] args) {
    String secretString = "yourSuperSecretKeyThatIsVeryLongAndRandom12345!";
    byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(secretString);
    Key signingKey = new SecretKeySpec(apiKeySecretBytes, SignatureAlgorithm.HS256.getJcaName());

    // --- Generate a token first (for demonstration) ---
    String jwtToValidate = Jwts.builder()
        .setSubject("user123")
        .setIssuedAt(new Date(System.currentTimeMillis()))
        .setExpiration(new Date(System.currentTimeMillis() + 60 * 1000)) // 1 min expiry
        .signWith(signingKey, SignatureAlgorithm.HS256)
        .compact();
    System.out.println("Generated JWT for validation: " + jwtToValidate);

    // --- Now validate it ---
    try {
      Jwts.parserBuilder()
          .setSigningKey(signingKey)
          .build()
          .parseClaimsJws(jwtToValidate);
      System.out.println("JWT is valid!");
    } catch (ExpiredJwtException e) {
      System.out.println("JWT validation failed: Token is expired!");
    } catch (MalformedJwtException | SignatureException | UnsupportedJwtException | IllegalArgumentException e) {
      System.out.println("JWT validation failed: Invalid token or signature. Reason: " + e.getMessage());
    }
  }
}

Menyimpan JWT dengan Selamat

Tempat dan cara JWT disimpan pada pihak klien memberikan kesan yang besar terhadap keselamatan:

  • Kuki HTTP sahaja: Biasanya disyorkan untuk token akses. Menetapkan bendera HttpOnly menghalang JavaScript (dan dengan itu serangan XSS) daripada mengakses token. Gunakan juga atribut Secure (untuk HTTPS) dan SameSite.
  • Storan Tempatan/Storan Sesi: Sangat terdedah kepada serangan Skrip Rentas Tapak (XSS), kerana mana-mana JavaScript pada halaman boleh mengakses storan ini. Tidak disyorkan untuk menyimpan JWT sensitif yang memberikan akses kepada sumber.

Untuk token penyegaran, pertimbangkan untuk menyimpannya dalam kuki HTTP sahaja yang selamat, manakala token akses yang berjangka pendek boleh disimpan dalam memori.

Serangan Umum & Langkah Pencegahan

Berwaspadalah terhadap vektor serangan JWT yang lazim berikut dan cara mengurangkannya:

  • Serangan "alg": "none": Penyerang cuba menukar algoritma dalam pengepala kepada "none". Pelayan anda mesti mengesahkan secara jelas pengepala alg dan menolak "none" atau mana-mana algoritma yang tidak dijangka.
  • Kunci Rahsia yang Lemah: Kunci rahsia yang mudah diteka atau pendek menjadikan pemaksaan tandatangan mudah dilakukan. Sentiasa gunakan kunci yang kukuh, rawak dan cukup panjang.
  • Tuntutan Tiada Tamat Tempoh (exp): Token tanpa tamat tempoh boleh digunakan tanpa had. Sentiasa tetapkan masa tamat tempoh yang singkat untuk token akses.
  • Serangan Ulangan: Walaupun mempunyai tamat tempoh, token yang sah boleh dipintas dan digunakan semula. Pertimbangkan untuk menggunakan tuntutan "JTI" (ID JWT) dan senarai hitam pada pelayan untuk token yang telah dibatalkan.

Pemeriksaan Keselamatan JWT

Seorang pembangun mengkonfigurasi bahagian belakang mereka untuk menerima JWT tetapi terlupa menentukan secara jelas algoritma penandatanganan yang diperlukan semasa pengesahan. Penyerang menghantar JWT dengan "alg": "none" dalam pengepala dan tanpa tandatangan.

Imbas Kembali: JWT yang Selamat

Kita telah membincangkan aspek penting keselamatan JWT:

  • JWT mesti sentiasa ditandatangani untuk memastikan integriti dan ketulenan.
  • Sentiasa sahkan tandatangan dan semua tuntutan yang berkaitan (tamat tempoh, pengeluar, khalayak).
  • Gunakan kunci rahsia yang kukuh dan algoritma penandatanganan yang sesuai (HS256, RS256).
  • Simpan JWT dengan selamat, sebaik-baiknya dalam kuki HTTP sahaja yang selamat untuk token akses, dan jika sesuai dalam memori untuk tempoh yang singkat.
  • Berwaspada terhadap serangan umum seperti kerentanan "alg": "none" dan laksanakan pemeriksaan algoritma secara jelas.

Pelaksanaan amalan ini dengan betul merupakan kunci untuk menggunakan JWT dengan selamat dalam aplikasi bahagian belakang anda.

Percuma untuk bermula

Pelajari Pengekodan Selamat dan OWASP Top 10 untuk Bahagian Belakang dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
12
Pelajaran
48

Soalan Lazim

Adakah pelajaran “Keselamatan dan Amalan Terbaik JWT” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Pengekodan Selamat dan OWASP Top 10 untuk Bahagian Belakang, termasuk “Keselamatan dan Amalan Terbaik JWT”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Pengekodan Selamat dan OWASP Top 10 untuk Bahagian Belakang merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Keselamatan dan Amalan Terbaik JWT”?

Terokai pertimbangan keselamatan JSON Web Tokens (JWT), termasuk penandatanganan, pengesahan dan penyimpanan yang betul untuk mencegah serangan lazim. Anda berlatih Pengekodan Selamat dan OWASP Top 10 untuk Bahagian Belakang menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Pengekodan Selamat dan OWASP Top 10 untuk Bahagian Belakang?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Pengekodan Selamat dan OWASP Top 10 untuk Bahagian Belakang di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.

Berapa lamakah pelajaran “Keselamatan dan Amalan Terbaik JWT” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Pengekodan Selamat dan OWASP Top 10 untuk Bahagian Belakang ini?

Ya. Setiap pelajaran Pengekodan Selamat dan OWASP Top 10 untuk Bahagian Belakang menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Pengesahan Berbilang Faktor (MFA)
  2. OAuth 2.0 dan OpenID Connect
  3. Keselamatan dan Amalan Terbaik JWT
  4. Penyimpanan Kata Laluan Selamat dan Pemulihan Kelayakan
← Kembali ke Pengekodan Selamat dan OWASP Top 10 untuk Bahagian Belakang