Ngày càng có nhiều phần mềm được tạo ra và hoạt động trên môi trường internet, một trong những cách phổ biến nhất để có thể kết nối, tích hợp những phần mềm ấy với nhau là thông qua API.
Để đảm bảo việc tích hợp được thông suốt thì việc test các API là cực kỳ quan trọng, có nhiều cách và có nhiều công cụ giúp chúng ta thực hiện việc test API được chính xác và hiệu quả, Postman là một trong số những công cụ đó.
Trong bài viết này, chúng ta cùng tìm hiểu về API testing và cách sử dụng Postman để thực hiện các dạng khác nhau của API testing nhé.
1. API testing là gì?
1.1. API testing là gì?
API testing là quá trình xác nhận rằng API hoạt động đúng như mong muốn. API testing là một cách để test tích hợp hệ thống giúp chúng ta kiểm chứng được khả năng tích hợp của một thành phần với những thành phần khác trong hệ thống.
1.2. Những lợi ích của API testing
- Không bị ràng buộc bởi ngôn ngữ sử dụng ở backend: Khi sử dụng API, chúng ta chỉ quan tâm tới giao thức đang sử dụng, cấu trúc dữ liệu là gì (JSON hay XML ...) mà không cần quan tâm tới việc đằng sau API đó được viết bởi ngôn ngữ gì, vì vậy có thể kết hợp nhiều ngôn ngữ lập trình trong cùng một hệ thống.
- Không bị ràng buộc bởi giao diện người dùng: Quá trình làm phần mềm có thể chia thành nhiều thành phần được phát triển độc lập và song song với nhau. Khi test api, chúng ta hoàn toàn có thể test được logic của backend mà không cần đợi frontend phải hoàn thiện, nên chúng có thể được phát triển song song.
- Release nhanh hơn: thông thường quá trình thực hiện API testing sẽ diễn ra nhanh hơn và API ít thay đổi hơn so với việc phải thực hiện test trên giao diện người dùng. Do vậy việc test API giúp chúng ta tiết kiệm được nhiều thời gian để xác minh được nhiều đặc tính của backend hơn là phải đi test trên frontend.
1.3. Có bao nhiêu kiểu API testing?
- Functional API testing: Bao gồm các bài test được thực hiện để đảm bảo các tính năng được đặc tả hoạt động đúng như mong muốn của một API riêng lẻ. Các bài test dựa trên các kịch bản được tạo sẵn theo các tham số đầu vào và đầu ra được xác định trước.
- Security API testing: Bao gồm các bài test để kiểm tra tính bảo mật của API như phải có có quyền mới được thực hiện hay phải có đủ token hoặc API key mới có thể thực hiện được API đó ...
- Load API testing: Các bài test chịu tải được thực hiện sau code đã hoàn thiện. Trong quá trình thực hiện test chịu tải, chúng ta cần giám sát và ghi nhận toàn bộ thông tin về hiệu năng của hệ thống như thời gian phản hồi, tài nguyên sử dụng... ở cả điều kiện khác nhau.
- Runtime and error detection: Nhằm mục đích tìm ra những lỗi có thể phát sinh khi lượng tải tăng cao hay dữ liệu đầu vào là những trường hợp đặc biệt để kiểm tra khả năng xử lý lỗi khi có phát sinh.
- Contract testing: API contract là một cách thể hiện giữa người và máy sao cho con người có thể đọc hiểu được chức năng của API đó, và cho biết được cấu trúc của response khi một request được gửi đi. API contract testing giúp đảm bảo những lần release mới sẽ không phá vỡ các thông tin đã biết trước đó về nội dung và của cấu trúc của request và response của API đó.
- API unit testing: Đây là quá trình xác thực một endpoint trả về đúng response khi gửi đi 1 request cho trước, loại test này giúp chúng ta xác minh được rằng 1 endpoint xử lý các tham số một cách chính xác hoặc trả về một lỗi hợp lý khi gửi request không hợp lệ.
- API end-to-end testing: Loại test này giúp xác nhận sự hoạt động các luồng chính cần sử dụng nhiều API, ở đó từng API được gọi lần lượt thành chuỗi để thể hiện nghiệp vụ của người dùng, và cần xác nhận được rằng mỗi API trong chuỗi hoạt động một cách phù hợp. API Chain testing giúp phát hiện sớm các vấn đề trong các tình huống phức tạp trước khi người dùng cuối thực hiện thao tác đó.
Hiện tại có nhiều công cụ giúp chúng ta thực hiện được nhiều loại test khác nhau với API, và Postman là một trong số công cụ được sử dụng nhiều hiện nay.
Chúng ta cùng tìm hiểu sâu hơn về Postman là gì trong những phần tiếp theo nhé
2. Postman là gì? Tìm hiểu Postman cơ bản
Postman là một nền tảng cho việc xây dựng và sử dụng API. Postman đơn giản hóa từng bước trong vòng đời API và làm hiệu quả, dễ dàng hơn việc cộng tác để bạn có thể tạo API tốt hơn - nhanh hơn.
Postman is an API platform for building and using APIs. Postman simplifies each step of the API lifecycle and streamlines collaboration so you can create better APIs—faster.
Nguồn: Trang chủ postman
3. Các chức năng chính của Postman
- API repository: Là nơi chứa tập trung thông tin về các API. Qua đó, chúng ta có thể phân loại, viết đặc tả, viết tài liệu hướng dẫn sử dụng, tạo ra các luồng thực thi, viết test case, test result... và cộng tác với những đồng nghiệp khác trên một nền tảng duy nhất.
- API tools: Là tập hợp các công cụ khác nhau cho phép cả nhóm làm việc trên toàn bộ vòng đời của API từ bước thiết kế, kiểm thử, viết tài liệu hướng dẫn sử dụng, giả lập dữ liệu, chia sẻ, và khám phá các API trong API repository.
- API collaboration: Với Postman, chúng ta có thể tạo ra các workspace khác nhau và phân quyền cho những workspace đó cho những đối tượng sử dụng khác nhau như: chỉ cá nhân, chỉ trong nhóm, chỉ cho đối tác hay cho toàn bộ thế giới truy cập vào API của chúng ta.
- API governance: Là tập các tính năng giúp chúng ta quản lý các API của mình dựa trên việc thiết lập các quy tắc cần tuân theo khi tạo và chạy API. Và dựa trên các báo cáo được tính hợp, chúng ta nhanh chóng biết được những API nào chưa được test, hay chưa được viết tài liệu...
- API Integrations: Postman được tích hợp với đa số các hệ thống mà chúng ta sử dụng hàng ngày trong quá trình phát triển phần mềm như: Circleci, Gitlab, Jenkins...
4. Vì sao nên sử dụng Postman cho API testing?
Vào tháng 4 năm 2022, trong một bài viết trên blog, Postman đã đánh dấu mốc đạt 20 triệu người dùng, với hơn 500k tổ chức đang sử dụng. Và dưới đây là một số lý do khiến cho Postman được sử dụng rộng rãi trên toàn thế giới đến như vậy:
- Test tự động: Postman cung cấp công cụ cho phép chúng ta viết các script test và thực thi chúng một cách tự động theo thời gian đặt trước, hoặc có thể tích hợp những script test đó vào trong CI/CD pipeline.
- Đa dạng loại test: Postman hỗ trợ nhiều loại test như integration tests, regression tests, functional tests, mock tests, end-to-end tests.
- Ứng dụng đa nền tảng: Postman online để có thể dùng trên bất cứ trình duyệt nào và cả ứng dụng cài đặt trên máy cho Windows, MacOS, Linux.
- Báo cáo: Postman tích hợp sẵn các loại báo cáo về các API đang sử dụng như: Thống kê số lượng API, số lượng workspace, đo lường thời gian cũng như tần suất xử dụng các API theo thời gian, tổng hợp thông tin về thời gian phản hồi và kích thước các response, số lượng test thành công, thất bại theo thời gian ...
- Phù hợp với tester ở mọi level : Người mới trong API testing có thể sử dụng cấu hình trực quan của Postman để sử dụng và test, với những người đã có kinh nghiệm thì có thể sử dụng script test để làm việc. Chúng ta có thể dùng Newman để tự tích hợp với CI/CD pipeline của mình.
Tuy nhiên, test API bằng Postman cũng tồn tại một số hạn chế:
- Bản cài trên desktop khá nặng và tiêu tốn nhiều tài nguyên của máy tính.
- Chưa có cơ chế tự động tạo data test dựa trên cấu hình form của request.
- Không có cơ chế kiểm soát phiên bản của script được viết trong Tests.
- Giá thành khá cao khi muốn sử dụng bản trả phí.
5. Các đối tượng chính trong Postman
Postman hoạt động dựa trên nhiều khái niệm đối tượng khác nhau, dưới đây là một số đối tượng chính Postman sử dụng để chúng ta có thể bắt với Postman. Ngoài ra còn dùng nhiều đối tượng khác chưa được liệt kê trong bài viết.
5.1. Request trong Postman là gì?
Request là đối tượng quan trọng nhất trong Postman, một request tương ứng với một API mà chúng ta muốn sử dụng. Khi cấu hình request, chúng ta sẽ cần điền các thông tin như URL, headers, method, body ... của request đó.
5.2. Folder trong Postman là gì?
Là tập hợp các request hoặc các folder khác, được tổ chức giống như cây thư mục file trên máy tính, giúp chúng ta dễ dàng tổ chức các request của mình theo các nhóm khác nhau. Một cách thường được sử dụng đó là tổ chức mỗi folder ứng với một resource trong REST API của một service.
5.3. Collection trong Postman là gì?
Là tập hợp các folder hoặc các request. Chúng ta có thể tổ chức mỗi collection như một service trong microservice.
5.4. Định nghĩa Workspace trong Postman
Là tập hợp của các collection. Chúng ta có thể tổ chức mỗi workspace là 1 hệ thống gồm nhiều service, mỗi service ứng với một collection.
5.5. Runs trong Postman
Runs giúp chúng ta chạy nhiều API cần thiết trong 1 collection nào đó thông qua cấu hình như trong ảnh dưới đây:
Sau khi cấu hình xong, chúng ta chạy các request đã được lựa chọn trong collection đó, và Runs sẽ thống kê kết quả mỗi lần chạy như ảnh dưới đây:
5.6. Variables trong Postman
Variables là các biến được định nghĩa bởi người dùng, mỗi Variable bao gồm 2 thành phần chính là tên và giá trị, chúng ta có thể khai báo Variables trong Collection, và tất cả các request trong collection ấy có thể sử dụng Variable đó.
Sau khi khai báo xong, chúng ta có thể sử dụng các Variables này trong cấu hình request của mình bằng cách đặt tên Variables trong cặp dấu ngoặc nhọn 2 lần, ví dụ {{subDomain}}
.
5.7. Environment trong Postman
Enviroment là định nghĩa cho môi trường mà request được chạy, chúng ta định nghĩa các Variables được sử dụng trong Enviroment đó. Luôn có 1 Enviroment mặc định là Global Enviroment, ngoài ra chúng ta có thể định nghĩa những Enviroment khác nhau để phục vụ quá trình test như dev
, stage
hay prod
.
Chúng ta có thể chuyển đổi Enviroment để thay đổi giá trị của các Variables để phù hợp với ngữ cảnh đang sử dụng
5.8. Tests trong Postman
Tests là nơi chúng ta viết các script test bằng Javascript để có thể kiểm tra kết quả đầu ra của lần chạy 1 request đó. Postman có sẵn khá nhiều các gợi ý hay dùng (ở trong mục Snippets) để chúng ta viết nhanh các test script chỉ qua 1 cú click chuột.
Khi viết test cho 1 request thì đoạn script đó chỉ chạy cho request đó, khi viết test cho folder và cho collection, thì đoạn script đó sẽ chạy cho tất cả request nằm trong folder, hay collection tương ứng mỗi khi request chạy xong.
5.9. Example trong Postman
Sau khi chạy request xong, chúng ta có thể lưu lại toàn bộ thông tin của lần chạy đó (request, response, time ...) thành một Example và có thể lấy các Example đó làm một loại tài liệu đặc tả cho API của mình.
6. Cách sử dụng Postman cho API testing
Các hướng dẫn dưới đây có thể áp dụng cho Postman trên toàn bộ nền tảng : Web, ứng dụng cài đặt trên MacOS, Windows, Linux. Trước khi test API với Postman, chúng ta cần đăng ký tài khoản trên Postman.
Trong những phần tiếp theo, 200lab sẽ sử dụng backend của ứng dụng todo list để lấy các ví dụ cho việc test API với Postman.
6.1. Tạo API với Postman
Trước tiên, 200lab sẽ tạo một collection 200lab todo list chứa 5 API như ảnh dưới đây. Quá trình tạo các api trong Postman là đơn giản khi các bạn đã biết về giao thức http và REST API, vì vậy quá trình tạo các API này sẽ không được nêu chi tiết trong bài viết này.
6.2. Test kết quả của API trong Postman
Chúng ta có thể sử dụng hai phương pháp sau đây để có thể test API:
- Test thủ công: Với mỗi API cần test, sau khi tạo xong, chúng nhấn nút Send để gửi request và xem xét một cách thủ công response của API đó ở ngay phía dưới màn hình, từ phần response đó, chúng ta có thể biết được API đã chạy đúng theo mong muốn hay chưa.
- Test tự động: Trong tab Tests của một request, chúng ta viết script để kiểm tra kết quả trả về của request đó, script của chúng ta sẽ tự động chạy ngay sau khi nhận được kết quả. Bạn cần phải biết cơ bản về Javascript thì mới có thể viết và hiểu được các script trong mục Tests này.
Để xác định được một API có hoạt động đúng như mong muốn hay không, chúng ta thường xét trên các yếu tố sau:
- Status code của response có đúng không?
- Thời gian phản hồi của response có nằm trong khoảng thời gian cho phép không?
- Định dạng dữ liệu trả về của response có đúng không? JSON hay XML hay binary hay text?
- Nội dung dữ liệu trả về có đúng không? Ví dụ: trường thông tin
id
có phải là một số nguyên hay không? - Chức năng có hoạt động đúng như mong muốn không? Ví dụ: Sau khi gọi API tạo một task thì khi gọi API lấy chi tiết task đó theo id thì response trả về cần đúng với các thông tin task đó được tạo lúc ban đầu.
Sau đây, chúng ta sẽ sử dụng script test để có thể kiểm tra tất cả các yếu tố trên nhé:
// Kiểm tra status code có phải là 200 không
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
// Kiểm tra thời gian phản hồi của response có nhỏ hơn 200ms không
pm.test("Response time is less than 200ms", function () {
pm.expect(pm.response.responseTime).to.be.below(200);
});
// Kiểm tra định dạng dữ liệu trả về có phải dạng json object không
pm.test("Check if response is json", function() {
var jsonData = pm.response.json();
pm.expect(jsonData).to.be.an('object')
});
// Kiểm tra dữ liệu trả về có id là số nguyên không
pm.test("Check if response have integer id", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.data).to.be.an('number')
});
Sau khi paste đoạn code sau vào phần Tests của API Create a new item và ấn Send, thì đoạn code sẽ tự động được chạy và trả về kết quả như hình dưới đây.
Trong nhiều trường hợp, việc kiểm tra một vài điều kiện nào đó là hoàn toàn lặp lại ở tất cả các api trong một collection, lúc này chúng ta có thể viết script cho những trường hợp ấy vào trong tab Tests của collection để không cần phải lặp lại những đoạn code đó trong từng request nữa.
Ví dụ, nếu yêu cầu đặt ra cho cả 5 api trong collection này là đều phải có thời gian phản hồi dưới 200ms và kết quả trả về phải ở định dạng JSON thì chúng ta hoàn toàn có thể để đoạn script dưới đây vào mục Tests của collection:
// Kiểm tra thời gian phản hồi của response có nhỏ hơn 200ms không
pm.test("Response time is less than 200ms", function () {
pm.expect(pm.response.responseTime).to.be.below(200);
});
// Kiểm tra định dạng dữ liệu trả về có phải dạng json object không
pm.test("Check if response is json", function() {
var jsonData = pm.response.json();
pm.expect(jsonData).to.be.an('object')
});
Khi bản thân 1 request có chứa script test và request đó nằm trong 1 folder hoặc 1 collection cũng có script test thì thứ tự thực thi script test sẽ từ trên xuống dưới, tức là sẽ chạy script test của collection rồi đến script test của folder và cuối cùng là chạy script test của request đó.
6.3. Sử dụng variable trong Postman
Trong quá trình phát triển phần mềm, chúng ta sử dụng nhiều môi trường khác nhau để kiểm thử, như môi trường dev
, stage
, prod
. Khi so sánh một API sử dụng giữa các môi trường, chúng có thể khác nhau về url, hay Authorization trong header ... và những sự khác biệt này là có quy luật.
Vì vậy, Postman cung cấp đối tượng environment và variable để chúng ta có thể tuỳ biến các giá trị này một cách tập trung thay vì phải vào từng request để chỉnh sửa.
Sau khi khai báo environment và các variable trong môi trường ấy, chúng ta có thể chọn environment để áp dụng cho các request cần chạy (như ở góc trên cùng bên phải của ảnh trên).
Và khi cấu hình api, ta có thể sử dụng biến {{domain}}
ở trong url, cũng như các thành phần khác của request. Ảnh dưới đây lấy ví dụ về việc sử dụng variable trong url:
Một ứng dụng nữa của variable đó chính là chúng ta có thể lấy kết quả của request chạy trước làm đầu vào của request chạy sau. Ví dụ: lấy id
trả về từ request Create a new item để làm tham số cho request Get item by id. Để có thể làm được việc này, chúng ta cần qua các bước sau:
- Khai báo variable
taskId
tron collection.
2. Viết code set lại giá trị cho taskId
trong tab Tests của request Create a new item.
3. Dùng variable taskId
trong url của request Get item by id.
4. Chạy lần lượt request Create a new item và Get item by id để xem kết quả.
Tương tự như với request Get item by id, chúng ta hoàn toàn có thể làm cách tương tự để có thể lấy được id từ một request bất kỳ nào đó và đưa vào test cho các api Edit item by id và Delete a item.
Tới đây, chúng ta đã có thể thể tự động kiểm tra xem kết quả trả về của từng request có hợp lệ hay không. Nhưng nếu số lượng request trong 1 collection tăng lên vài chục, thậm chí cả trăm thì việc phải chạy thủ công từng request để kiểm tra là rất tốn thời gian. Runs (mô tả ở mục 4.5) giúp chúng ta giải quyết vấn đề này.
6.4. Data-driven test với Postman
Khi chạy test cho API, cần xét tới nhiều trường hợp đầu vào khác nhau của để kiểm tra đầu ra tương ứng. Chúng ta có thể làm bằng cách thay đổi thủ công các cấu hình của request, rồi ấn chạy để kiểm tra response. Tuy nhiên cách này rất tốn thời gian và không thể tái sử dụng khi số lượng trường hợp nhiều lên.
Và sử dụng data-driven testing sẽ giúp chúng ta giải quyết vấn đề trên. Để thực hiện được data-driven testing trên Postman, chúng ta cần thực hiện qua các bước sau:
1. Tạo test data:
Test data dùng trong Postman có thể ở dạng JSON hoặc CSV. Nếu ở dạng JSON, test data phải là mảng của các object. Trong Tests, chúng ta có thể lấy giá trị của một key trong từng object (hoặc trong từng dòng của CSV) thông qua lệnh pm.iterationData.get("key")
.
Ảnh bên trên cho ta ví dụ về test data giành cho request Create a new item với mảng của các object, mỗi object chứa key là title
của task cần tạo.
2. Chỉnh sửa variable trong cấu hình và test của request:
Khi chạy request với test data, Postman sẽ lặp qua từng phần tử của mảng và mỗi phần tử coi như 1 lần chạy, và lúc này, từng key
ở level đầu tiên của từng object có thể xem như 1 variable của lần chạy đó, do vậy chúng ta có thể sửa cấu hình của request như ảnh dưới đây (ứng với data ví dụ của phần trước):
Và lúc này trong phần Tests của từng request, chúng ta có thể kiểm tra kết quả trả về của request có đúng như dữ liệu đã được truyền cho lần chạy đó hay không:
Khi làm theo các bước trên, rất có thể bạn sẽ gặp tình huống các task sinh ra có title là {{title}}
. Có thể xảy ra việc này do chúng ta chạy thủ công 1 request bằng nút Send, lúc này không có mảng để lặp nên không có variable title
, do vậy task luôn nhận title là {{title}}
.
Để không bị rơi vào trường hợp như trên, chúng ta nên khai báo biến title
trong collection và để giá trị mặc định là một cụm từ có nghĩa nào đó (Task title example
chẳng hạn), lúc này trong bất cứ tình huống nào thì biến title
sẽ luôn tồn tại và task tạo ra luôn có title có ý nghĩa.
3. Chạy test:
Để chạy được test với data đã có ở bước 1, chúng ta cần lựa chọn fle trong mục Data của cấu hình chạy của Postman:
Sau khi nhận file thành công, giá trị trong mục Iterations sẽ tự động tăng lên bằng đúng số lượng phần tử trong file data, chúng ta có thể điều chỉnh số giá trị của Iterations này nhỏ hơn, nhưng nếu điều chỉnh lớn hơn có thể sinh ra lỗi trong lúc thực thi các request trong collection.
Trong mục chạy test này, ngoài việc chạy collection bằng tay, chúng ta còn có thể cấu hình cho lần chạy này tự động được thực thi vào một khoảng thời gian nào đó bằng cách lựa chọn radio box Schedule runs hoặc chạy qua dòng lệnh bằng cách lựa chọn radio box Automate runs via CLI.
4. Phân tích kết quả:
Sau khi chạy xong các request trong collection, Postman sẽ lưu lại toàn bộ thông tin của từng request và response và tổng hợp cho chúng ta những chỉ số quan trọng nhất như hình bên dưới:
Ngoài ra, nhìn vào bảng kết quả này, chúng ta có thể biết được API nào bị thất bại hay thành công ở lần lặp thứ mấy. Từ đó chúng ta có thể nhanh chóng tái hiện được lần chạy thất bại đó với data tương ứng trong file đã chọn ở bước 3.
7. Kết luận về Postman & ứng dụng trong API testing
API testing là bước quan trọng trong quá trình phát triển phần mềm để đảm bảo hệ thống có thể hoạt động đúng như mong muốn. Với API test, chúng ta cần quan tâm nhiều tới các yếu tố khác nhau như chức năng, bảo mật, hiệu năng của từng API và khi kết hợp các API với nhau.
Hiện nay có rất nhiều công cụ hỗ trợ cho chúng ta thực hiện API testing, và Postman là một công cụ đắc lực được tin dùng bởi hàng chục triệu nhà phát triển trên khắp thế giới. Với những tính năng linh hoạt, mạnh mẽ, hỗ trợ nhiều đối tượng sử dụng, Postman có thể giúp chúng ta thực thi API testing một cách dễ dàng.
Hiểu và biết cách test API với Postman trong những tình huống khác nhau sẽ giúp chúng ta làm chủ công cụ này dễ dàng và biến Postman trở thành công cụ hữu ích cho không chỉ tester và còn cho cả developer và các bên khác tham gia vào quá trình phát triển phần mềm.
Tài liệu tham khảo:
- https://learning.postman.com/docs
- Data-driven testing using Postman
- https://apievangelist.com/2022/01/27/twenty-problems-that-postman-is-solving-for-developers-in-2022/
Giờ thì bạn đã hiểu rõ về Postman là gì và những ứng dụng cơ bản trong API testing. Hãy đọc thêm các bài viết hữu ích về Python trên trang Blog Lập Trình & Dữ Liệu của 200Lab nhé. Cũng đừng quên đăng ký các lớp học hay ho trên 200Lab nhé.
Các bài viết liên quan bạn sẽ thích:
- Bitbucket là gì? GitHub là gì? So sánh Bitbucket và GitHub
- Cách giải quyết lỗi password authentication Github
- Frontend Du Ký | EGANY Apps : Đừng thấy hoa nở mà ngỡ xuân về
- Mobile & Web UI Kit For Flutter (100+ screens)
- Tự học Dart: Các Dart Operators (toán tử) bạn cần biết
- Hướng dẫn clone instagram với React JS và Firebase phần 3
Bài viết liên quan
Hướng dẫn tích hợp Redux và React Query trong dự án React Vite
Nov 22, 2024 • 8 min read
Giới thiệu Kiến trúc Backend for Frontend (BFF)
Nov 16, 2024 • 10 min read
Flask là gì? Hướng dẫn tạo Ứng dụng Web với Flask
Nov 15, 2024 • 7 min read
Webhook là gì? So sánh Webhook và API
Nov 15, 2024 • 8 min read
Spring Boot là gì? Hướng dẫn Khởi tạo Project Spring Boot với Docker
Nov 14, 2024 • 6 min read
Two-Factor Authentication (2FA) là gì? Vì sao chỉ Mật khẩu thôi là chưa đủ?
Nov 13, 2024 • 7 min read