Top 12 # Xem Nhiều Nhất Tìm Hiểu Về Json Mới Nhất 3/2023 # Top Like | Cuocthitainang2010.com

Tìm Hiểu Về Json Web Token

It’s that time of the month again, time for yet another last minute report, in an desperate attemp to save our precious 2-days salary. And again, i wish this would be the last time i have to do so.

Tình cờ đọc lại một bài report của chính mình viết từ khá lâu trước đây Tản mạn về API design, mình đã viết một câu khá là chất

Nếu chỉ nhìn thoáng qua, từ flow xác thực, cho đến nguyên lí chung, JWT và OAuth2 khá là tương đồng, có khác chăng chỉ là về cấu trúc của mỗi loại token

thật sự là đọc xong câu này, cảm giác rất là (facepalm), đúng kiểu khi xưa ta bé ta ngu =)). Thế nên, trong khuôn khổ 2 ngày lương tháng này, xin mạn phép được viết chi tiết hơn một chút về JSON Web Token, để phần nào chữa thẹn cho tuyên bố sai lè trên kia.

JWT là gì

Nói về mặt định nghĩa chính thức, thì khái niệm Java Web Token được mô tả một cách đầy đủ nhất như sau

JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is used as the payload of a JSON Web Signature (JWS) structure or as the plaintext of a JSON Web Encryption (JWE) structure, enabling the claims to be digitally signed or integrity protected with a Message Authentication Code (MAC) and/or encrypted.

aaaaaaaaaa.bbbbbbbbbbb.cccccccccccc

Ta dễ dàng nhận ra, có 3 phần là 3 chuỗi kí tự, được ngăn cách với nhau bởi kí tự dấu . Và cũng không có gì là quá bất ngờ khi tôi nói với bận rằng, 3 phần này có ý nghĩa riêng của chúng, biểu thi cho những thông tin nhất định. Ta cùng đi vào tìm hiểu từng phần một

Header

Chuỗi kí tự đầu tiên trong một JWT biểu thị cho phần header. Thông thường thì phần header này sẽ bao gồm 2 thông tin, thứ nhất là loại của token ( trong trường hợp này là jwt ) , và thứ 2 là loại thuật toán mã hóa được sử dụng trong token ( cái này đến đoạn sau sẽ nói rõ dùng ở đâu). Xin được nói thêm một chút là bạn hoàn toàn có thể thêm các thông tin khác vào đây, ko sao cả, JWT bạn tạo ra có thể vẫn sẽ đúng, nhưng phần header, chỉ cần có 2 thông tin kia là đủ rồi. Các thông tin đó, sau khi được biểu diễn dưới dạng JSON object, chẳng hạn như

{ "alg": "HS256", "typ": "JWT" }

ta đưa vào Base64Encode. Và như vậy, ta đã có được phần đầu tiên, header của JWT. Ở đây xin mở rộng ra một chút , và cũng xin được nói trước là phần mở rộng này là “chém gió” của mình, nên xin cân nhắc suy xét trước khi tin, vì như ngay phần đầu tiên đã nói, các bài report của mình viết sai cũng không phải là hiếm =)) . Trước tiên, ta hiểu được tại sao lại là JSON, đơn giản có lẽ là vì JSON object là cách đơn giản nhất để biểu thị các thông tin mà ta cần truyền tải. Với header, lượng thông tin còn ít, nhưng sang payload, sẽ có rất nhiều thông tin ta cần phải đưa ra, JSON là một lựa chọn tốt để diễn đạt. Thêm nữa, tại sao lại cần phải đưa qua Base64Encode, cái này có lẽ đơn giản là để có thể thực hiện việc truyền qua header của HTML request.

Payload

Giống giống kiểu hồi bé học làm văn vâỵ, header có thể gọi là cái mở bài, giới thiệu qua về cái JWT của ta, còn payload này sẽ là phần thân bài, chứa nội dung chính, chủ yếu mà ta cần truyền tải. Hiểu một cách đơn giản thì là như thế, phần thứ hai – payload – của JWT sẽ chứa nội dung thông tin mà ta cần truyền đi, ví dụ như

{ "author": "DungNQ", "handsome": true }

Nói cụ thể hơn một chút, thì bên trong payload sẽ chứa các khai báo (claim). Các claim này sẽ bao gồm dữ liệu mà ta muốn truyền đi, và có thể cả các thông tin khác về token của ta nữa. Chia nhỏ ra thì claim bao gồm các loại như sau

Register Claim ( Reserved Claim ) : Các claim này , tuy không phải là bắt buộc , nhưng được khuyến khích là nên có thì tốt hơn. Là các claim đã được định nghĩa sẵn, thống nhất từ trước về mặt ý nghĩa, ai nhìn cũng có thể hiểu nó biểu hiện điều gì. Các claim này chứa những thông tin về bản thân token của chúng ta, chứ không phải là thông tin mình muốn truyền tải. Tuy nhiên , nó cũng tương đối đi vào chi tiết nên không thích hợp để đặt vào phần header – giới thiệu chung. Có thể kể ra một vài registered claim như : iss (issuer), exp (expiration time), sub (subject), aud (audience) … Cụ thể , bạn thể có thể xem ở tài liệu này hay hàng hịn hơn, do đội Internet Engineering Task Force cung cấp . Vì là những claim được thống nhất sẵn, nên cũng chỉ có vài cái thôi, đọc cũng nhanh.

Private Claim: Ngược lại, các claim này do chúng ta tùy ý định nghĩa, để chứa những thông tin mà ta muốn truyền đi. Về mặt ý nghĩa của nó, chỉ cần người tạo ra token, và người nhận token hiểu với nhau là đủ. Như cái ví dụ củ chuối ở trên chẳng hạn, chính là một dạng private claim.

Public Claim: Có thể nói là trung gian hòa giải giữa 2 dạng trên, các claim này cũng do ta tùy ý định nghĩa để truyền tải thông tin mà mình muốn. Tuy nhiên, để cho dễ hiểu và tránh tình trạng conflict, các claim dạng này nên được khai báo tại IANA JSON Web Token Registry

Ngoài ra , ở đây còn có một khuyến khích nhỏ, là nếu có thể, tên của các claim, bạn nên giới hạn dùng một chuỗi 3 kí tự để đảm bảo tính tinh gọn của JWT, nhưng cái đó không quá quan trọng. Tương tự như phần Header, sau khi tạo ra một json object chứa các thông tin payload như trên, ta đem vào Base64Encode, và như thế, ta đã có được phần thứ 2 của JWT.

Signature

Như ở trên đã nói, giống kiểu khi ta làm văn vậy, Header là mở bài, Payload là thân bài, còn phần cuối cùng của một JWT – gọi là signature – cũng theo một nghĩa nào đó, làm nhiệm vụ kết bài, tổng kết lại cho 2 phần trước. Nhưng có thể nói đây là phần quan trọng nhất, là linh hồn của JWT. Những gì JWT làm được , như nhiệm vụ làm xác thực, hay đảm bảo tính toàn vẹn của dữ liệu, đều từ đây mà ra. Về cách tạo ra signature, ta đem những chuỗi encode tạo được bên trên, cộng với một chuỗi bí mật secret, sử dụng qua thuật toán mã hóa khai báo trong header, đem mã hóa và tạo thành chuỗi signature. VÍ dụ nếu ta dùng HMAC SHA256

HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

Chuỗi secret sẽ là một chuỗi chỉ có người tạo ra token, và người mà họ muốn nhận được thôn tin , biết.

Làm việc với JWT

Qua việc tìm hiểu cấu trúc và cách tạo nên một JWT, ta có thể dễ dàng nhận ra những đặc điểm sau :

Bất kì ai, nếu có trong tay chuỗi secret, đều có thể tự tạo ra một JWT. Điều này có nghĩa là, khác với trong flow OAuth2, khi mà client cần liên lạc với resource server để nhận được access token, nếu bạn quyết định sử dụng JWT là công cụ để xác thực, bản thân client có thể tạo ra JWT cũng được.

Với mỗi request khác nhau, nghĩa là nội dung payload khác nhau, ta sẽ có các JWT khác nhau.

Bản thân bên trong JWT đã chứa payload, nghĩa là chứa nội dung cần truyền tải rồi, nên ta hoàn toàn có thể lấy được nội dung này chỉ từ bản thân token mà thôi

Với việc nội dung chuỗi secret tham gia vào quá trình tạo và giải mã JWT, nhưng không hề xuất hiện trong dữ liệu truyền đi, và chuỗi này chỉ có người gửi thông tin và người mà ta muốn gửi thông tin tới được biết, JWT có thể dùng để thực hiện công việc xác thực ( authorization )

Nội dung thông tin truyền tải đi ( payload ) được đánh dấu ( signed ) thông qua signature, nên JWT có thể được sử dụng trong kịch bản truyền tải dữ liệu bình thường, để đảm bảo tính toàn vẹn của dữ liệu được truyền đi.

Thế nên, ta có thể dựng nên một vài workflow khi làm việc với JWT :

Trong trường hợp xác thực với JWT

Phía gửi và phía nhận thông tin ( ví dụ như client và server ) cùng thống nhất trước với nhau một chuỗi secret . Một kịch bản thường gặp là, ta đăng kí user và password, sau đó sử dụng chính password làm chuỗi secret

Khi thực hiện việc đăng nhập cho user, phía client đã có được username và password

Khi thực hiện một request lên phía server, client chủ động đưa vào payload và dựng lên JWT. Lưu ý là trong nội dung payload nên có thông tin để định danh user, ví dụ như user id hay username. Kết hợp với password lấy được từ phía client, tạo ra payload.

Phía server nhận được request, lấy ra JWT từ header. Base64Decode để lấy được thông tin header và payload. Sau đó, dựa vào thông tin định danh ( username ) trong payload, lấy ra chuỗi secret ( password ) tương ứng lưu trên server. Server qua đó tạo nên signature và so sánh với signature của JWT do client gửi lên. Nếu giống nhau, ta có thể xác định danh tính của user là hợp lệ, và nội dung của request là nguyên bản.

Trong trường hợp đảm bảo tính toàn vẹn của dữ liệu truyền tải

Kịch bản xác thực bên trên, thực ra bao gồm trong nó đã đảm bảo tính toàn vẹn của dữ liệu rồi. Nếu muốn chỉ làm việc đó không, đơn giản chỉ là, phía nhận thông tin quy định sẵn một chuỗi secret. Và tất cả các phía muốn gửi thông tin lên, đều được cho biết trước chuỗi secret này. Qua đó tạo ra JWT tương ứng với mỗi gói tin. Cách xác định xem JWT này có hợp lệ ko, thực hiện tại bên nhận thông tin tương tự như trên

Tìm Hiểu Về Json Trong Javascript

Tổng quan về JSON

JSON viết tắt bởi JavaScript Object Notation. Dịch nôm na thì nó là “Kí hiệu object trong JavaScript”.

Nếu bạn đã biết về JavaScript Object thì bạn có thể thấy rằng ví dụ trên cũng chính là biểu diễn cho một Object trong JavaScript. Trong đó, gồm có hai thành phần:

Ứng dụng

JSON thường được dùng trong cơ sở dữ liệu NoSQL (ví dụ như MongoDB) và là một chuẩn giao tiếp trên web.

Khi một client gửi request lên server thì server có thể gửi kết quả trả về dạng JSON (hoặc XML). Client bóc tách kết quả đó và dựa vào key để lấy ra thông tin cần thiết. Việc sử dụng JSON thay vì XML giúp giảm thời gian truy xuất dữ liệu và giảm dung lượng gói tin.

Quay lại ví dụ trên, nếu mình dùng XML để biểu diễn thì nó sẽ như sau:

Rõ ràng, XML phức tạp hơn ở chỗ là XML cần phải có 2 thành phần thẻ đóng và thẻ mở để xác định một thuộc tính. Trong khi JSON chỉ cần 1 thành phần là key.

So sánh với JavaScript Object

Mặc dù JSON rất giống JavaScript Object nhưng vẫn có một số giới hạn khác như:

Key: luôn luôn phải được đóng gói trong cặp dấu ngoặc kép, không phải ngoặc đơn, cũng không được phép là biến số (variable)

Value: Chỉ được phép là những dữ liệu cơ bản như numbers, strings, Boolean, array, object, null, không được phép là function, date, undefined hoặc là một biểu thức tính toán.

Không được phép tồn tại dấu phẩy cuối cùng như JavaScript Object.

Đối với number thì không được phép có chữ số 0 ở đầu. Ngoài ra, nếu đó là chữ số thập phân thì phải có ít nhất 1 chữ số sau dấu chấm (.).

Ví dụ về JSON không hợp lệ

Ví dụ về JSON hợp lệ

Cách sử dụng

JavaScript cung cấp sẵn cho chúng ta hai hàm số là: JSON.stringify và JSON.parse:

JSON.stringify dùng để convert một JavaScript Object thành JSON string.

JSON.parse dùng để convert string biểu diễn JSON thành JavaScript Object.

Hãy xem ví dụ sau:

Điều đó đồng nghĩa với việc nếu bạn muốn chỉnh sửa JSON thì có thể convert nó thành Object để sửa đổi các thuộc tính, giá trị. Sau đó convert JavaScript Object đó ngược lại thành JSON.

Lời kết

JSON là một thành phần quan trọng dùng để lưu trữ dữ liệu và là chuẩn giao tiếp giữa client và server. Hy vọng qua bài viết này bạn hiểu được JSON là gì và cách sử dụng nó. Vì chắc chắn là bạn sẽ phải sử dụng nó nhiều.

Hẹn gặp lại bạn ở bài viết sau, thân ái!

Tìm Hiểu Jwt(Json Web Token) Authentication

Mở đầu.

JWT(JSON Web Token) là công nghệ phổ biến ngày nay, nhưng cũng đồng thời cũng gây tranh cãi rất nhiều.

Có nhiều người nói đừng bao giờ dùng nó, trong khi những người khác lại nói nó thật tuyệt vời. Vậy sự thật là gì? Nên hay không nên dùng? Đó là lý do chúng ta ở đây.

1. Giới thiệu ngắn gọn về JWT.

JWT về mặt kỹ thuật là một cơ chế để xác minh chính chủ một số dữ liệu JSON. Nó là một chuỗi biến đổi, có thể chứa một lượng dữ liệu không giới hạn (không giống như một cookie) và nó đã được mã hóa bằng chữ ký.

Khi một máy chủ nhận được JWT, nó có thể đảm bảo dữ liệu mà nó chứa có thể được tin cậy bởi vì nó đã được xác thực với chữ ký đã được lưu trữ. Không yếu tố trung gian nào có thể sửa đổi JWT sau khi nó được gửi.

Điều quan trọng cần lưu ý là JWT đảm bảo quyền sở hữu dữ liệu nhưng không mã hóa; bất kỳ ai cũng có thể xem dữ liệu JSON chúng ta lưu trữ trong JWT một khi họ có được JWT đấy, vì nó chỉ được tuần tự hóa, không được mã hóa. Vì lý do này, nên sử dụng JWT với HTTPS.

2. Vậy nó tốt trong trường hợp nào?

JWT là một công nghệ tuyệt vời để xác thực API và ủy quyền từ máy chủ đến máy chủ.

Nó không phải là một lựa chọn tốt cho các session.

3. Sử dụng JWT để xác thực API

Ứng dụng nhiều nhất của JWT Token, và mục đích duy nhất bạn nên sử dụng JWT là dùng nó như một cơ chế xác thực API.

Điều này hiện nay là quá phổ biến và được sử dụng rộng rãi, kể cả Google cũng sử dụng JWT để xác thực các APIs của họ.

Ý tưởng rất đơn giản:

Bạn sẽ nhận được secret token từ service khi bạn thiết lập API

Ở phía client, bạn sẽ sử dụng secret token để kí tên và gắn nó vào token (hiện nay có rất nhiều thư viện hỗ trợ việc này)

Bạn sẽ gắn nó như một phần của API request và server sẽ biết nó là ai dựa trên request được ký với 1 unique identifier duy nhất:

4. Vô hiệu hoá 1 single token

Làm thế nào bạn có thể làm mất hiệu lực môt single token? Một cách đơn giản là thay đổi secret key của server, làm mất hiệu lực tất cả các token. Nhưng làm vậy sẽ khiến khách hàng choáng váng, không hiểu vì sao mà token của họ “toang” như vậy.

Một cách khác để xử lý vấn đề này là thêm yếu tố thời gian vào đối tượng người dùng. Mã token tự động lưu trữ giá trị created at trong thuộc tính iat. Mỗi lần bạn kiểm tra token, bạn chỉ cần so sánh giá trị created at với giá trị thời gian ở đối tượng user.

Để vô hiệu hóa token, chỉ cần cập nhật giá trị phía máy chủ và nếu iat cũ hơn, bạn có thể reject token.

5. Lưu trữ JWTs an toàn

JWT cần được lưu trữ ở nơi an toàn bên trong trình duyệt của người dùng.

Nếu bạn lưu trữ nó bên trong localStorage, nó có thể truy cập bằng bất kỳ script nào trong trang của bạn (điều này thực sự tệ, vì một cuộc tấn công XSS có thể cho phép kẻ tấn công bên ngoài lấy được token).

Đừng lưu token trong localStorage (hoặc sessionStorage). Nếu bất kỳ mã script bên thứ ba nào bạn đưa vào trang của mình bị xâm phạm, nó có thể truy cập tất cả các token của người dùng. JWT cần được lưu trữ bên trong httpOnly cookie, một loại cookie đặc biệt mà chỉ có thể gửi trong các yêu cầu HTTP đến server và nó không bao giờ có thể truy cập (cả để đọc hoặc viết) từ JavaScript chạy trên trình duyệt.

6. Sử dụng JWT để trao đổi thông tin an toàn giữa hai máy chủ

Vì JWT đã được ký, người nhận có thể chắc chắn rằng khách hàng thực sự là người mà họ nghĩ.

6.1. Sử dụng JWT cho xác thực SPA

JWTs có thể được sử dụng như một cơ chế xác thực không cần đến cơ sở dữ liệu. Server có thể tránh sử dụng cơ sở dữ liệu vì dữ liệu lưu trữ trong JWT được gửi cho khách hàng là an toàn.

6.2. Sử dụng JWT để uỷ quyền hoạt động trên các máy chủ

Giả sử bạn đăng nhập vào 1 máy chủ, SERVER1, sau khi đăng nhập thành công thì được chuyển hướng đến một máy chủ khác SERVER2 để thực hiện một số xử lý.

SERVER1 có thể cấp cho bạn 1 JWT để ủy quyền cho phép bạn kết nối đến SERVER2. Hai máy chủ không cần chia sẻ cùng 1 session hoặc bất cứ điều gì để xác thực bạn. Sử dụng token để xử lý trường hợp này là rất hoàn hảo.

7. Session tokens cho các regular web apps

Bạn có thể nghĩ rằng việc sử dụng JWTs cho session token là một ý tưởng hay lúc đầu, chẳng hạn:

Bạn có thể lưu trữ bất kỳ loại thông tin user nào trên client Server có thể tin tưởng client vì JWT đã được ký và không cần phải gọi cơ sở dữ liệu để lấy thông tin bạn đã lưu trữ trong JWT Bạn không cần phải kết hợp các sessions trong cơ sở dữ liệu tập trung khi bạn gặp vấn đề cần horizontal scaling Cuối cùng, nếu bạn đã có cơ sở dữ liệu cho ứng dụng của mình, chỉ cần sử dụng bảng session và sử dụng các regular session được hỗ trợ bởi các framework server side là đủ.

Tại sao? Sẽ mất nhiều công sức nếu sử dụng JWT: vì chúng được gửi trong mọi request đến máy chủ và nó luôn luôn mất công sức hơn là sử dụng server-side sessions.

8. Cách chọn thư viện JWT hoàn hảo

Hãy vào trang chúng tôi và xem danh sách thư viện. Nó có danh sách các thư viện phổ biến nhất để triển khai JWT.

Chọn ngôn ngữ bạn dùng và chọn thư viện mà bạn thích, thư viện tốt nhất là thư viện có số lượng tích xanh nhiều nhất.

9. Kết luận

JWT là một tiêu chuẩn rất phổ biến mà bạn có thể sử dụng để xác thực requests bằng cách sử dụng chữ ký và trao đổi thông tin giữa các bên. Hãy chắc chắn rằng bạn lúc nào thì sử dụng nó, lúc nào thì không và cách ngăn chặn các vấn đề bảo mật cơ bản nhất.

Nguồn: https://blog.logrocket.com/jwt-authentication-best-practices/

Mã Thông Báo Web Json – Json Web Token (Jwt)

Bài viết dựa trên tài liệu theo dõi tiêu chuẩn mở Internet. Đây là sản phẩm của nhóm chuyên viên kỹ thuật Internet (IETF) và hoành thành vào tháng 05 năm 2015. Những tác giả chính của tiêu chuẩn là M. Jones làm việc tại Microsoft, J. Bradley đến từ Ping indentity và N. Sakirumra đến từ NRI. Nó là sản phẩm thể hiện sự chung sức của cộng đồng IETF đồng thời nó đã nhận được đánh giá công khai và được phê duyệt đề xuất bản bởi khối chỉ đạo kỹ thuật Internet (IESG). Đây là tài liệu mở nhưng dễ hiểu và dễ sử dụng, đến nay JWT đã vô cùng phổ biến và được sử dụng rộng dãi trên toàn cầu. Đây là phiên bản duy nhất và vẫn được giữ được sự tin cậy cao trong các tiêu chuẩn mạng.

Hình 1: Mô phòng cho JWT

Nội dung chi tiết

1. Khái quát JSON Web Token

Như đã nói ở phần giới thiệu, JWT nhỏ gọn định nghĩa cách thức truyền tin an toàn giữa các thành viên bằng một đối tượng JSON. Thông tin này có thể xác thực và đánh dấu tin cậy nhờ vào “chữ ký” của nó. Phần chữ ký này được mã hóa lại bằng HMAC hoặc RSA.

Hình 2 : Kết cấu của JWT

Header bao gồm hai phần chính: loại token và thuật toán đã dùng để mã hóa. Trong đó loại token có thể mặc định là JWT, một loại thông tin mà cho biết đoạn mã là một token JWT. Thuật toán có thể là HMAC SHA256 – HS256 hoặc RSA.

Payload chứa các “Claims”. Claims là một khối thông tin về một thực thể chẳng hạn người dùng là ai và một số metadata bắt buộc, số còn lại tuân theo về JWT hợp lệ và đầy đủ thông tin: iss (issuer), iat (issued-at time) exp (expiration time), sub (subject), aud (audience), … độ trễ phải hồi lại từ máy chủ khi tiếp nhận là do độ dài của Payload.

Singnature là chữ ký trong JWT hay một chuỗi đã được được mã hóa bởi header, payload cùng với một chuỗi bí mật theo nguyên tắc sau:

Hình 3 : Nguyên tắc của chuỗi chữ ký JWT

2. Cách thức hoạt động của JWT

Hình 4: Cách thức hoạt động của JWT

Như lượng đồ ở trên, chuỗi JWT được thực hiện theo một chu trình sau:

1. Người dùng (user) sử dụng trình duyệt đăng nhập vào một miền nào đó mà yêu cầu đăng nhập với tên đăng nhập và mật khẩu.

2. Máy chủ sẽ nhận được yêu cầu của người dùng, đồng thời kiểm tra thông tin tên đăng nhập và mật khẩu.

3. Máy chủ sau khi kiểm tra thông tin người dùng, nếu đúng sẽ trả một JWT về cho người dùng, nếu không quay lại bước 1.

4. Người dùng sẽ sử dụng mã JWT để tiếp tục sử dụng cho các yêu cầu kế tiếp trên miền của máy chủ.

5. Máy chủ sẽ không cần phải kiểm tra lại thông tin người dùng mà chỉ cần kiểm tra đúng JWT đã được cấp từ đó tăng tốc độ sử dụng trên miền giảm thời gian truy vấn.

6. Máy chủ trả phản hồi phù hợp cho người dùng.

Qua quá trình được nêu, rất rõ ràng JWT được tạo ra như một cách để trao đổi thông tin xác thực an toàn giữa hai bên. Vì vậy, JWT không ẩn, không làm mờ, không che giấu dữ liệu mà chỉ nhằm chức minh dữ liệu được tạo ra bởi một nguồn xác thực.

3. Tạo mã thông báo Web JSON

Để tạo một JWT, cần phải qua các bước sau, thứ tự của các bước không bắt buộc trong trường hợp không có sự phụ thuộc giữa đầu vào và đầu ra của các bước:

– Bước 1: Tạo bộ yêu cầu JWT chứa các giá trị Claim mong muốn. Lưu ý rằng biểu diễn khoảng trắng được cho phép tường minh mà không cần hợp thức hoá trước khi mã hoá.

– Bước 2: Đặt một tin nhắn là các octet của đại diện UTF-8 trong bộ Claim JWT.

– Bước 3: Tạo một Tiêu đề JOSE chứa bộ Thông số Header mong muốn. JWT PHẢI tuân thủ thông số kỹ thuật [JWS] hoặc [JWE]. Lưu ý rằng khoảng trắng được cho phép rõ ràng trong biểu diễn và không cần phải chuẩn hóa trước khi mã hóa.

– Bước 4: Tùy thuộc vào việc JWT là JWS hay JWE, có hai trường hợp:

+ Nếu JWT là JWS, hãy tạo JWS bằng Thông báo dưới dạng Tải trọng JWS; tất cả các bước được chỉ định trong [JWS] để tạo JWS PHẢI được tuân theo.

+ Khác, nếu JWT là JWE, hãy tạo JWE bằng cách sử dụng Tin nhắn làm văn bản gốc cho JWE; tất cả các bước được chỉ định trong [JWE] để tạo JWE PHẢI được tuân theo.

– Bước 5: Nếu thao tác ký hoặc mã hóa lồng nhau sẽ được thực hiện, hãy để Tin nhắn là JWS hoặc JWE và quay lại Bước 3, sử dụng giá trị “cty” (loại nội dung) của “JWT” trong JOSE header mới được tạo trong bước đó.

– Bước 6: Mặt khác, giá trị JWT kết quả là JWS hoặc JWE.

4. Xác thực JWT

a. Xác thực rằng JWT chứa ít nhất một ký tự (‘.’).

b. Đoạn mã hóa JOSE Header phải được dặt ở vị trí trước ký tự (‘.’) đầu tiên của JWT.

c. Basse64 mã hóa JOSE header theo nguyên tắc là không có ngắt dòng, khoảng trắng hoặc các ký tự bổ sung khác đã được sử dụng.

d. Xác minh rằng chuỗi kết quả octet là một đại diện được mã hóa UTF-8 xủa một đối tượng JSON hoàn toàn hợp lệ tuân thủ RFC 7159 [RFC7159]; và để JOSE Header là một đối tượng JSON.

e. Xác minh rằng JOSE Header kết quả chỉ bao gồm các tham số, giá trị có cú pháp, ngữ nghĩa được hiểu và hỗ trợ hoặc được chỉ định là bị bỏ qua khi không hiểu.

f. Xác định xem JWT là JWS hay JWE bằng bất kỳ phương pháp khác thuộc JWE.

g. Tùy thuộc vào việc JWT là JWS hay JWE, có hai trường hợp:

– Nếu JWT là JWS, hãy làm theo các bước được chỉ định thuộc JWS để xác thực JWS. Đặt tin nhắn là kết quả của việc giải mã Base64url cho dữ liệu của JWS.

– Mặt khác, nếu JWT là JWE, hãy làm theo các bước được chỉ định trong JWE để xác thực JWE. Hãy để tin nhắn là bản mã JWE.

i. Mặt khác, base64url mã hóa tin nhắn theo hạn chế rằng không có ngắt dòng, khoảng trắng hoặc các ký tự bổ sung khác đã được sử dụng.

j. Xác minh rằng chuỗi kết quả octet là một đoạn mã UTF-8 đại diện cho một đối tượng JSON hoàn toàn hợp lệ tuân thủ RFC 7159 [RFC7159]; hãy để Bộ công bố JWT là đối tượng JSON này.

Cuối cùng, lưu ý rằng đây là một quyết định của ứng dụng mà thuật toán có thể được sử dụng trong ngữ cảnh cụ thể. Ngay cả khi JWT có thể được xác nhận thành công, trừ khi (các) thuật toán được sử dụng trong JWT được ứng dụng chấp nhận, nó vẫn có thể từ chối JWT.

5. Quy tắc so sánh chuỗi

Việc xử lý JWT chắc chắn đòi hỏi phải so sánh các chuỗi đã biết với các thành phần và giá trị nằm trong các JSON Object. Các quy tắc JSON để thực hiện so sánh tên thành phần được mô tả trong Định dạng trao đổi dữ liệu ký hiệu đối tượng JavaScript (JSON).

Các quy tắc so sánh này PHẢI được sử dụng cho tất cả các so sánh chuỗi JSON ngoại trừ trong trường hợp định nghĩa của thành phần gọi rõ ràng rằng quy tắc so sánh khác sẽ được sử dụng riêng cho giá trị thành phần đó. Và vì vậy, chỉ các giá trị thành viên “typ” và “cty” không sử dụng các quy tắc so sánh này.

Một số ứng dụng có thể bao gồm thông tin không phân biệt chữ hoa chữ thường trong giá trị phân biệt chữ hoa chữ thường, chẳng hạn như bao gồm tên DNS như một phần của giá trị khiếu nại “iss” (nhà phát hành). Trong các trường hợp đó, ứng dụng có thể cần xác định một quy ước cho trường hợp chính tắc được sử dụng để biểu diễn các phần không phân biệt chữ hoa chữ thường, chẳng hạn như yêu cầu viết thường, nếu nhiều bên có thể cần tạo ra cùng một giá trị thì mục đích để có thể so sánh chúng. (Tuy nhiên, nếu tất cả các bên sử dụng giá trị bên sản xuất đã phát hành mà không tham chiếu với giá trị độc lập nào khác thì giá trị được sử dụng bởi nhà sản xuất có thể không có ý nghĩa.)

6. Việc lưu trữ JWT trên máy chủ.

Trên thực tế, JWT được lưu trữ trên 2 cách chính đó là:

– HTML5 Web Storeage (localStorage hoặc sessionStorage)

– Cookies

Cả hai phương thức đều nhận JWT ở trình duyệt của người dùng, cả hai đều không lưu trạng thái vì tất cả các thông tin mà API cần là JWT. Cả hai phương thức đều gửi mã thông báo (token) lên Api một cách đơn giản nhưng điều khác biệt lớn nằm ở tính bảo mật.

Đối với bảo mật JWT lưu trữ trên sessionStroreage và localStoreage, máy chủ có thể truy cập được thông qua javaScript trên cùng domain. Hay nghĩa là bất cứ code javaScript nào chạy trên chính miền của máy chú đó có thể bị tấn công bằng XSS (một dạng lỗ hổng làm kẻ tấn công chèn được một đoạn code vào miền của máy chủ). Do đó phương pháp thông thường là loại bỏ và mã hóa tất cả các dữ liệu không tin tưởng được, tuy nhiên điều này là khó và không thể bảo mật toàn bộ.

Đối với bảo mật JWT lưu trữ trên cookie, thì khi được dùng cùng với cookie flag (HttpOnly) thì không thể bị truy cập bởi các đoạn code hay nhiễm XSS. Đồng thời có thể đặt cookie flag (đảm bảo chỉ trả JWT khi đi qua htttp đã được mã hóa hoặc xác thực) để đảm bảo rằng cookie chỉ được gửi qua HTTPS. Do đây việc lưu trữ JWT trên cookie là được khuyến nghị.

Một số trường hợp, nếu là trình duyệt web thì JWT có thể lưu vào localStoreage, Ứng dụng IOS thì sẽ là Keychain và ứng dụng Android thì sẽ lưu vào SharedPrefernces.

7. Khía cạnh bảo mật

Tất cả các cân nhắc bảo mật trong đặc điểm kỹ thuật JWS cũng áp dụng cho JWT, cũng như các cân nhắc bảo mật JWE khi sử dụng mã hóa. Đặc biệt, Cân nhắc về bảo mật JWS JSON và Cân nhắc về bảo mật so sánh Unicode áp dụng như nhau đối với Bộ yêu cầu JWT theo cách tương tự như đối với Tiêu đề JOSE.

JWT có thể chứa các thông tin bí mật về quyền riêng tư của người dùng. Trong trường hợp này, PHẢI thực hiện các biện pháp để ngăn chặn việc tiết lộ thông tin này cho các bên ngoài ý muốn. Một cách để đạt được điều này là sử dụng JWT được mã hóa và xác thực người nhận, ứng dụng, máy chủ ứng dụng. Một cách khác là đảm bảo rằng các JWT chứa thông tin bí mật về quyền riêng tư không được mã hóa chỉ được truyền bằng các giao thức sử dụng mã hóa hỗ trợ xác thực điểm cuối, chẳng hạn như TLS (Transport layer security) – giao thức bảo mật tần giao vận. Bỏ qua thông tin nhạy cảm về quyền riêng tư khỏi JWT là cách đơn giản nhất để giảm thiểu các vấn đề về quyền riêng tư.

Ngoài yếu tố bảo mật về quyền riêng tư, JWT gần như tuyệt đối an toàn nằm xác thực ủy quyền.

Kết luận

JWT là một cơ chế xác thực vô cùng phổ biến và tuyệt vời. Nó cho phép người dùng khai báo thông tin người dùng và phạm vi truy cập của họ một cách có cấu trúc. Nó có thể được mã hóa và ký để chống giả mạo từ phía ứng dụng. Đồng thời việc hiểu rõ JWT cũng giúp việc nắm bắt một số tiêu chuẩn như tiêu chuẩn OpenID, OpenAPI, v.v một cách chính xác hơn, hiểu một cách rõ ràng và logic nhất.

Thông qua tiêu chuẩn mở này, ta có thêm các khía cạnh về bảo mật để xây dựng các nền tảng mới, đặc biệt nó là thành phần quan trọng trong tiêu chuẩn OpenID Connect 1.0. Nó cũng sẽ thành phần quan trọng để xây dựng khung chính phủ điện tử hướng tới xây dựng và phát triển chính phủ điện tử 2.0.

Vũ Cao Minh Đức

Tài liệu tham khảo

https://viblo.asia/

https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32

Jones, M., “JSON Web Algorithms (JWA)”, draft-ietf-jose-json-web-algorithms , December 2014.

Jones, M. and J. Hildebrand, “JSON Web Encryption (JWE)”, draft-ietf-jose-json-web-encryption , December 201

Jones, M., Bradley, J., and N. Sakimura, “JSON Web Signature (JWS)”, draft-ietf-jose-json-web-signature , December 2014.