Jwt la gi
JSON Web Token (JWT) là 1 tiêu chuẩn mở (RFC 7519) định nghĩa cách thức truyền tin an toàn giữa các thành viên bằng 1 đối tượng JSON. Thông tin này có thể được xác thực và đánh dấu tin cậy nhờ vào “chữ ký” của nó. Phần chữ ký của JWT sẽ được mã hóa lại bằng HMAC hoặc RSA. Show Token-based authentication là gì?Token-based authentication là phương thức xác thực bằng chuỗi má hóa. Một hệ thống sử dụng Token-based authentication cho phép người dùng nhập user/password để nhận về 1 chuỗi token. Chuỗi Token này được sử dụng để “xác minh” quyền truy cập vào tài nguyên mà không cần phải cung cấp lại username/password nữa. Tiếp theo, chúng ta sẽ tìm hiểu về phương pháp sử dụng Token-based authentication bằng JWT (Json Web Token). JWT – JSON Web Token là gì?JSON Web Token là một chuỗi mã hóa mà nguồn gốc ban đầu là một chuỗi JSON. Chuỗi thông tin dạng JSON bằng phương pháp mã hóa nào đó, nó trở thành 1 chuỗi ký tự lộn xộn nhìn vào sẽ rất khó hiểu. Như vậy, Bảo mật JWT là phương pháp xác thực quyền truy cập (Authentication) bằng JSON Web Token. Cấu trúc của một JWTDưới đây là 1 JSON Web Token JWT trên bao gồm 3 phần:
Cấu trúc của nó theo format như sau Image Credit – Toptal HeaderHeader bao gồm hai phần chính:
Chuỗi JSON trên sau khi được mã hóa base64url sẽ trở thành như sau String header = "{\"alg\":\"HS256\",\"typ\":\"JWT\"}"; System.out.println(Base64.getUrlEncoder().encodeToString(header.getBytes()));Output: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 PayloadLà nơi chứa các nội dung của thông tin (claim). Thông tin truyền đi có thể là mô tả của 1 thực thể (ví dụ như người dùng) hoặc cũng có thể là các thông tin bổ sung thêm cho phần Header. Chúng được chia làm 3 loại: reserved, public và private
3. Private: Phần thông tin thêm dùng để truyền qua giữa các client. Ví dụ Ta có ví dụ cho phần Payload như sau { "sub": "nhs3108", "exp": 1558065420 }Đoạn JSON trên sau khi được mã hóa base64url sẽ trở thành như sau String payload = "{"sub":"nhs3108","exp":1558063837}"; System.out.println(Base64.getUrlEncoder().encodeToString(payload.getBytes()));Output: eyJzdWIiOiJuaHMzMTA4IiwiZXhwIjoxNTU4MDYzODM3fQ SignaturePhần chữ ký được tạo bằng cách kết hợp 2 phần Header + Payload, rồi mã hóa nó lại bằng 1 giải thuật encode bất kỳ ví dụ như HMAC SHA-256 Có thể xem lại công thức sau: Với signature là phần kết hợp giữa header và payload Ở 2 phần trên, ta đã có String header = "{\"alg\":\"HS256\",\"typ\":\"JWT\"}"; String encodedHeader = Base64.getUrlEncoder().encodeToString(header.getBytes()); String payload = "{"sub":"nhs3108","exp":1558063837}"; String encodedPayload = Base64.getUrlEncoder().encodeToString(payload.getBytes()); String signature = encodedHeader + "." + encodedPayload; String encodedSignature = HMACSHA256.encode(signature, scretKey); System.out.println(encodedSignature);Flow hệ thống sử dụng JWTChúng ta sẽ dùng sở đồ sau để hình dung Nhìn vào hình ta có thể thấy flow đi như sau:
Hệ thống Verify chuỗi JWT thế nào?Câu hỏi đặt ra ở đây là hệ thống Verify JWT thế nào:
Khi nào sử dụng JWT?Với JWT, bạn không cần phải giữ session data trên server để xác thực user. Luồng đi như sau:
Các sessions sẽ có thời hạn hết hạn và cần phải được xử lý kiểu xoá đi các session hết hạn này. JWT hoàn toàn có thể sở hữu chính expiry date của chính nó kèm với dữ liệu user. Cho nên khi tầng Security check authen của JWT, nó có thể check expiry time của token và đơn giản là từ chối truy cập. Nếu không sử dụng session thì bạn mới có thể ứng dụng tạo một service thuần RESTful, bởi vì một service thuần RESTful được định nghĩa là phải stateless. Với dung lượng nhỏ, JWT có thể được gửi lên với mọi request cũng giống như session cookie. Nhưng ko giống với session cookie, nó ko cần phải trỏ đến bất kỳ dữ liệu nào được lưu trữ trên server, bản thân JWT đã có dữ liệu. Theo topdev.vn Japan IT Works sưu tầm |