Làm cách nào để tạo khóa bí mật cho JWT trong PHP?

Nếu bạn đã từng phải viết mã API sớm hơn thì sau này bạn sẽ tự hỏi làm thế nào để bảo mật thông tin liên lạc này

Bên cạnh nhu cầu rõ ràng về việc sử dụng lớp cổng an toàn để tránh những con mắt không mong muốn, còn có nhiều mối quan tâm khác cần được giải quyết, đặc biệt nếu thông tin được trao đổi là nhạy cảm

Trong bài viết này, bạn sẽ tìm hiểu về JWT, một công cụ giúp cải thiện tính bảo mật của các giao tiếp dựa trên web trong khi vẫn duy trì chi phí thấp và cách triển khai nó trong các ứng dụng dựa trên PHP của bạn

Nội dung ẩn

JWT là gì

Tại sao bạn nên sử dụng JWT

JWT hoạt động như thế nào

Cách triển khai JWT trong PHP

Phần kết luận

JWT là gì

Hãy cùng bắt đầu lại từ đầu. JWT là viết tắt của từ gì?

JWT là viết tắt của Json Web Tokens. Nó là một cơ chế được thiết kế để truyền thông tin một cách an toàn giữa các máy tính bằng cách sử dụng Đối tượng Json

Tính bảo mật của JWT dựa trên việc sử dụng các giao thức nổi tiếng để mã hóa mã thông báo, cụ thể là HMAC hoặc cặp khóa công khai-riêng tư

Có thể tìm thấy mô tả đầy đủ tại RFC này

Tại sao bạn nên sử dụng JWT

Trong bất kỳ trường hợp nào mà bạn cần đảm bảo thông tin bạn nhận được không bị giả mạo trên đường đi hoặc bạn muốn giữ thông tin ở chế độ riêng tư, JWT có thể hữu ích

Các trường hợp sử dụng điển hình cho JWT là

  • ủy quyền
  • trao đổi thông tin

Trong trường hợp ủy quyền, ý tưởng là tạo mã thông báo duy nhất sau khi người dùng được xác thực

Mã thông báo này sẽ được gửi cùng với mọi yêu cầu tiếp theo và ở phía máy chủ, sẽ được xác thực để xác định xem hành động được yêu cầu có nằm trong khả năng của người dùng hay không

Đối với việc trao đổi thông tin, JWT có thể xác minh danh tính người gửi và tính toàn vẹn của tin nhắn

Có một vài lựa chọn thay thế cho JWT, cụ thể là SAML [Ngôn ngữ đánh dấu xác nhận bảo mật] và SWT [Mã thông báo web đơn giản]

Ưu điểm của việc sử dụng JWT so với các đối thủ cạnh tranh trực tiếp là

  1. Tính nhỏ gọn [Bằng cách dựa trên Json thay vì XML, bản thân các mã thông báo nhỏ hơn nhiều, điều này giúp cho việc xử lý chúng cũng hiệu quả hơn]
  2. Tính khả dụng của ký không đối xứng [SWT không thể triển khai nó và đối với trường hợp SAML, làm như vậy có nghĩa là ký XML cồng kềnh so với sự đơn giản của việc thực hiện trên chuỗi json]

Một tình huống cụ thể hơn mà bạn có thể tận dụng JWT là việc triển khai cơ chế SSO vì như bạn sẽ sớm biết, mã thông báo có thể chứa tất cả thông tin cần thiết để đánh giá cả bên phát hành và bên nhận, giúp máy chủ hoạt động thực sự dễ dàng.

JWT hoạt động như thế nào

Cách an toàn nhất để sử dụng JWT do máy chủ cung cấp là để máy khách gửi nó qua tiêu đề Ủy quyền trong mọi yêu cầu tiếp theo, như thế này

ủy quyền. Người mang $TOKEN

Vì vậy, quy trình làm việc sẽ như sau

  1. Máy khách gửi thông tin đăng nhập của nó đến máy chủ
  2. Máy chủ tạo mã thông báo và gửi lại cho máy khách
  3. Khách hàng đưa ra một yêu cầu mới bao gồm mã thông báo
  4. Máy chủ xác minh mã thông báo và phản hồi tương ứng

Mã thông báo bao gồm ba chuỗi json được phân tách bằng dấu chấm và mã hóa base64

tiêu đề

Tiêu đề có hai phím

  • đánh máy. Loại mã thông báo, hiện tại, nó luôn là JWT
  • tảo. Thuật toán được sử dụng để ký mã thông báo, giá trị của nó phải là một trong những giá trị được xác định trong RFC

Khối hàng

Tải trọng là phần quan trọng nhất của mã thông báo, đó là nơi lưu trữ các xác nhận quyền sở hữu

Yêu cầu có thể được sử dụng để trao đổi bất kỳ loại thông tin nào mà ứng dụng của bạn cần, nhưng có một số trường tiêu chuẩn thường được sử dụng

  • là. Trường này được sử dụng để xác minh tính xác thực của mã thông báo bằng cách thiết lập danh tính của bên phát hành. Nó bao gồm một chuỗi [thường là một URL]
  • kinh nghiệm. Thời gian hết hạn mà sau đó mã thông báo được coi là không hợp lệ
  • nghe. Trường này dành cho người nhận để xác thực rằng mã thông báo đã được cấp cho họ. Nó bao gồm một danh sách các chuỗi [có thể chứa một phần tử]
  • iat. Giá trị ngày được biểu thị dưới dạng số mà giá trị này xác định thời điểm JWT được phát hành
  • nbf. Giá trị ngày được biểu thị dưới dạng số được sử dụng để từ chối mã thông báo cho đến khi đạt đến thời điểm này. Nó được sử dụng phổ biến nhất để tránh các sự cố đồng bộ hóa

Bạn có thể xem danh sách đầy đủ các khiếu nại tại đây.  

Chữ ký

Phần cuối cùng của mã thông báo là thứ làm cho toàn bộ cơ chế hoạt động, nó lưu trữ kết quả của việc áp dụng thuật toán băm được chỉ định trong tiêu đề để nối tiêu đề được mã hóa bằng base64, dấu chấm, tải trọng được mã hóa bằng base64

Chẳng hạn, nếu bạn đang sử dụng HMAC kết hợp với SHA 256 [“HS256”], bạn sẽ nhận được chữ ký bằng cách tính toán

hash_hmac[‘sha256′, base64_encode[$header]. ’. ’. base64_encode[$payload], $secret];

Điều này sẽ dẫn đến thành phần cuối cùng của mã thông báo

base64_encode[$header]. ’. ’. base64_encode[$payload]. base64_encode[$signature]

Một chi tiết bạn cần lưu ý là nội dung của mã thông báo không được mã hóa, nghĩa là mặc dù chúng không thể bị thay đổi trên đường từ bên này sang bên kia, nhưng thông tin liên lạc này có thể bị chặn và đọc bởi một

Phải nói rằng, bạn cũng có khả năng sử dụng cặp khóa riêng tư/công khai để mã hóa nội dung của mã thông báo, bằng cách khôi phục lại một thuật toán khác

Để ngăn chặn các sự cố bảo mật, giao tiếp phải được thực hiện qua lớp cổng bảo mật và mã thông báo không được lưu trữ trong trình duyệt

Cách triển khai JWT trong PHP

Tất nhiên, bạn có thể tự tạo và xác thực mã thông báo, xét cho cùng, đó chỉ là việc xử lý một số json và base64, phải không?

Chà, điều đó có thể đúng nhưng, như thường lệ, có những sắc thái có thể khiến việc triển khai php khó hơn mức cần thiết

Trên thực tế, có một thư viện bạn có thể sử dụng cho nó. PHP-JWT

Chỉ cần chạy lệnh composer require firebase/php-jwt và bạn sẽ có thư viện sẵn sàng để sử dụng bên trong mã của mình

Hãy cùng xem cách một máy chủ REST do bạn sáng tạo sẽ tạo JWT cho các máy khách của nó

Chủ Đề