Mười cách chứng minh bạn là aiTen ways to prove who you are
Mọi cơ chế xác thực trả lời đúng một câu hỏi: cái gì được phép băng qua ranh giới giữa bạn và hệ thống, và ai giữ bí mật ở phía bên kia.Every authentication mechanism answers one question: what is allowed to cross the line between you and the system, and who holds the secret on the far side.
Phần này dùng hằng ngày. Phần tra cứu chi tiết nằm bên dưới.This is the part you use daily. The reference cards come after it.
Trước hết: khi nào không cần gì cảFirst: when you need none of them
Người dùng đăng ký trực tiếp, không có bên thứ ba nào cần chạm vào dữ liệu của họ, không có khách hàng doanh nghiệp nào đòi hỏi gì. Khi đó phương án rẻ nhất và an toàn nhất là mật khẩu băm bằng Argon2id, phiên lưu ở server, cookie HttpOnly + Secure + SameSite. Không OAuth, không JWT, không IdP.Users sign up directly, no third party needs their data, no enterprise customer is asking for anything. The cheapest and safest option is passwords hashed with Argon2id, server-side sessions, and an HttpOnly + Secure + SameSite cookie. No OAuth, no JWT, no IdP.
Ba tín hiệu cho biết bạn đã vượt qua mức này: một app bên thứ ba cần truy cập dữ liệu người dùng (→ OAuth 2.0); khách hàng doanh nghiệp muốn đăng nhập bằng tài khoản công ty (→ SAML hoặc OIDC); các dịch vụ nội bộ cần nhận ra nhau mà không dùng bí mật chung (→ mTLS).Three signals say you have outgrown it: a third-party app needs access to user data (→ OAuth 2.0); an enterprise customer wants their corporate login (→ SAML or OIDC); internal services must recognize each other without a shared secret (→ mTLS).
Cây quyết định 30 giâyThirty-second decision tree
Ai đang đăng nhập?
│
├─ Con người, tài khoản của chính dịch vụ bạn
│ ├─ Muốn bỏ hẳn mật khẩu?
│ │ ├─ Có, chấp nhận phụ thuộc Apple/Google ──▶ Passkeys
│ │ └─ Có, nhưng muốn thật đơn giản ─────────▶ Magic Link
│ └─ Giữ mật khẩu ────────────────────────────▶ Mật khẩu + MFA
│
├─ Con người, tài khoản do tổ chức khác quản lý
│ ├─ Khách hàng doanh nghiệp ──────────────────▶ SAML
│ └─ Người dùng phổ thông, đăng nhập Google ───▶ OIDC
│
├─ App bên thứ ba thay mặt người dùng ───────────▶ OAuth 2.0 + PKCE
│
└─ Máy nói chuyện với máy
├─ Cùng cụm / service mesh ─────────────────▶ mTLS
├─ Qua internet, đối tác tích hợp ──────────▶ OAuth client_credentials
└─ Cần xong trong một buổi chiều ───────────▶ API key có hạn
Who is logging in?
│
├─ A human, account on your own service
│ ├─ Want passwords gone entirely?
│ │ ├─ Yes, Apple/Google dependency is fine ─▶ Passkeys
│ │ └─ Yes, but keep it dead simple ─────────▶ Magic Link
│ └─ Keeping passwords ───────────────────────▶ Password + MFA
│
├─ A human, account owned by another org
│ ├─ Enterprise buyer ─────────────────────────▶ SAML
│ └─ Consumer signing in with Google ──────────▶ OIDC
│
├─ Third-party app acting for a user ────────────▶ OAuth 2.0 + PKCE
│
└─ Machine talking to machine
├─ Same cluster / service mesh ─────────────▶ mTLS
├─ Across the internet, partner ────────────▶ OAuth client_credentials
└─ Must ship this afternoon ────────────────▶ Expiring API key
Mười cơ chếThe ten mechanisms
Chỉ sáu trong số này là giao thức. Hai là mẫu thiết kế, một là chính sách, một là kiến trúc. Chúng được xếp lại theo đúng họ của mình, không theo thứ tự trong ảnh gốc.Only six of these are protocols. Two are design patterns, one is a policy, one is an architecture. They are regrouped by what they actually are, not by the order in the original image.
01
Uỷ quyền & liên kết — “ai bảo lãnh cho người này?”Delegation & federation — “who vouches for this person?”
uỷ quyền · không phải xác thựcauthorization · not authentication
OAuth 2.0
Cấp cho một app quyền hạn chế vào dữ liệu của bạn ở dịch vụ khác, mà không đưa mật khẩu.Grants an app limited access to your data on another service, without handing over a password.
dùng chouse forApp bên thứ ba đọc dữ liệu của bạn ở ngân hàng, GitHub, Google Calendar.Third-party apps reading your data at a bank, GitHub, Google Calendar.
đượcyou gainApp không thấy mật khẩu. Quyền cắt nhỏ theo scope, thu hồi riêng từng app, token hết hạn sau vài phút.The app never sees the password. Scoped access, per-app revocation, tokens expiring in minutes.
mấtyou loseKhông biết người dùng là ai. Token là bearer. Redirect URI khớp lỏng là lỗ hổng chiếm tài khoản.No idea who the user is. Tokens are bearer. Loose redirect URI matching is an account-takeover hole.
Chọn OAuth 2.0 là đổi sự đơn giản của một bí mật duy nhất lấy khả năng cấp quyền hạn chế và thu hồi được cho bên thứ ba.Choosing OAuth 2.0 trades the simplicity of one shared secret for the ability to grant narrow, revocable access to third parties.
Dấu hiệu nhận biết: “app này cần chạm vào dữ liệu của tôi nằm ở chỗ khác”.Recognition cue: “this app needs to touch my data that lives somewhere else”.
lớp danh tính trên OAuthidentity layer over OAuth
OpenID Connect
OAuth lo việc được làm gì. OIDC thêm câu trả lời cho “người này là ai”.OAuth handles what you may do. OIDC adds the answer to “who is this”.
dùng chouse forNút “Đăng nhập bằng Google/Apple”. SSO hiện đại cho web, SPA và mobile.“Sign in with Google/Apple” buttons. Modern SSO for web, SPA and mobile.
đượcyou gainKhông bao giờ lưu mật khẩu. Discovery tự động, tích hợp provider mới mất vài giờ.You never store a password. Discovery makes a new provider a few hours of work.
mấtyou loseProvider sập là bạn sập. Bỏ kiểm tra aud là token app khác dùng được ở app bạn.Their outage is your outage. Skip the aud check and another app’s token works on yours.
Chọn OIDC là đổi sự phụ thuộc vào một nhà cung cấp danh tính bên ngoài lấy việc không bao giờ phải tự bảo vệ kho mật khẩu.Choosing OIDC trades dependence on an external identity provider for never having to defend a password database.
Dấu hiệu nhận biết: bạn cần một danh tính ổn định để lưu vào database, không chỉ cần quyền gọi API.Recognition cue: you need a stable identity to store, not just permission to call an API.
SSO doanh nghiệp · XML · 2005enterprise SSO · XML · 2005
SAML 2.0
IdP phát ra một tài liệu XML đã ký; ứng dụng tin tài liệu đó và tạo phiên.The IdP issues a signed XML document; the app trusts it and creates a session.
dùng chouse forBán SaaS cho doanh nghiệp lớn. Okta, Entra ID, Ping, ADFS.Selling SaaS to large enterprises. Okta, Entra ID, Ping, ADFS.
đượcyou gainNgôn ngữ mọi phòng IT đã nói. Thuộc tính tổ chức đi kèm sẵn trong assertion.The language every IT team speaks. Org attributes ride along in the assertion.
mấtyou loseXML-DSig rất khó làm đúng. Không có câu trả lời cho SPA. Chứng thư hết hạn là sập toàn bộ đăng nhập.XML-DSig is hard to get right. No story for SPAs. An expired certificate takes down every login.
Chọn SAML là đổi sự dễ chịu khi lập trình lấy quyền được bán hàng cho doanh nghiệp lớn.Choosing SAML trades developer comfort for the right to sell into large enterprises.
Dấu hiệu nhận biết: bên mua là một phòng IT, không phải người dùng cuối.Recognition cue: the buyer is an IT department, not an end user.
kiến trúc · không phải giao thứcarchitecture · not a protocol
Single Sign-On
Đăng nhập một lần ở IdP; mọi app tin IdP đó đều nhận ra bạn. SAML và OIDC là hai cách hiện thực.Log in once at the IdP; every app that trusts it recognizes you. SAML and OIDC are two ways to build it.
dùng chouse forTổ chức có hàng chục app SaaS, cần onboard và offboard nhân viên nhanh.Organizations running dozens of SaaS apps with fast on/offboarding.
đượcyou gainGỡ quyền toàn tổ chức bằng một thao tác. Chính sách MFA áp đặt ở một chỗ. Nhật ký tập trung.Remove access everywhere in one action. MFA policy in one place. Central audit log.
mấtyou loseIdP sập là cả công ty dừng. Chiếm được tài khoản IdP là chiếm mọi app. Single Logout hiếm khi lan tới nơi.An IdP outage stops everyone. One compromised IdP account opens every app. Single Logout rarely propagates.
Chọn SSO là đổi việc dồn toàn bộ rủi ro vào một điểm lấy khả năng cấp và gỡ quyền cho cả tổ chức chỉ bằng một thao tác.Choosing SSO trades concentrating all risk in one place for granting or removing access org-wide in a single action.
Dấu hiệu nhận biết: câu hỏi thật không phải “đăng nhập thế nào” mà là “gỡ quyền thế nào”.Recognition cue: the real question isn’t how people log in, it’s how access gets removed.
02
Bằng chứng trực tiếp — “người này cầm cái gì?”Direct proof — “what does this party hold?”
chống lừa đảo · danh tính ở tầng kết nốiphishing-resistant · identity at the connection layer
mTLS
Cả hai phía trình chứng thư và chứng minh mình giữ khoá riêng, trước khi byte dữ liệu đầu tiên đi qua.Both sides present a certificate and prove they hold the private key, before the first byte of data moves.
dùng chouse forMicroservice trong cùng cụm, kết nối tới hệ thống thanh toán, đội thiết bị IoT.Services inside one cluster, payment processors, IoT fleets.
đượcyou gainKhông có chuỗi bearer nào để đánh cắp. Xác thực xong trước khi request vào tới code.No bearer string to steal. Authentication completes before the request reaches your code.
mấtyou loseBạn phải vận hành một PKI thật. Chứng thư hết hạn gây sự cố đồng loạt. Thu hồi rất khó.You now run a real PKI. Expiries cause simultaneous outages. Revocation is genuinely hard.
Chọn mTLS là đổi gánh nặng vận hành PKI lấy một danh tính không thể bị đánh cắp chỉ bằng cách đọc trộm log.Choosing mTLS trades the burden of running a PKI for an identity that cannot be stolen by reading a log.
Dấu hiệu nhận biết: hai đầu đều là máy, và bạn không muốn tồn tại bất kỳ bí mật nào copy được.Recognition cue: both ends are machines, and you want no copyable secret to exist.
chống lừa đảo · khoá gắn với tên miềnphishing-resistant · key bound to the domain
Passkeys / WebAuthn
Khoá riêng nằm trong phần cứng của thiết bị và không bao giờ rời khỏi đó. Máy chủ chỉ giữ khoá công khai.The private key stays in device hardware and never leaves. The server keeps only the public key.
dùng chouse forSản phẩm tiêu dùng muốn bỏ mật khẩu; tài khoản quản trị; ngân hàng trên di động.Consumer products dropping passwords; admin accounts; mobile banking.
đượcyou gainChống lừa đảo ở mức giao thức. Không còn kho mật khẩu để bị đánh cắp. Đăng nhập một chạm.Phishing resistance built into the protocol. No password database to steal. One-touch login.
mấtyou loseKhôi phục tài khoản thành phần khó nhất. Passkey đồng bộ thừa hưởng bảo mật của tài khoản Apple/Google.Recovery becomes the hard part. Synced passkeys inherit the security of the Apple/Google account.
Chọn passkey là đổi quyền kiểm soát quy trình khôi phục, giao phần lớn nó cho hệ sinh thái Apple/Google, lấy việc loại bỏ hoàn toàn lừa đảo mật khẩu.Choosing passkeys trades control over account recovery, much of it moving into the Apple/Google ecosystem, for eliminating password phishing entirely.
Dấu hiệu nhận biết: rủi ro lớn nhất của bạn là người dùng nhập mật khẩu vào trang giả.Recognition cue: your biggest risk is users typing credentials into a fake page.
bằng chứng gián tiếp · dựa vào hòm mailindirect proof · rests on the mailbox
Magic Links
Một đường dẫn dùng một lần gửi qua email. Nó chứng minh đúng một điều: người này mở được hòm mail đó.A one-time link sent by email. It proves exactly one thing: this person can open that mailbox.
dùng chouse forSản phẩm giai đoạn đầu, công cụ nội bộ, luồng mời tham gia, app đăng nhập thưa.Early-stage products, internal tools, invite flows, apps with infrequent logins.
đượcyou gainKhông mật khẩu để lộ hay đặt lại. Ít màn hình, ít code. Xác minh email miễn phí kèm theo.No password to leak or reset. Fewer screens, less code. Email verification for free.
mấtyou loseAn toàn đúng bằng hòm mail người dùng. Bộ quét link doanh nghiệp bấm trước và đốt mất token.Security equals the user’s mailbox, no more. Corporate link scanners click first and burn the token.
Chọn magic link là đổi việc giao toàn bộ bảo mật tài khoản cho nhà cung cấp email của người dùng lấy một luồng đăng nhập gần như không có code.Choosing magic links trades handing account security to the user’s email provider for a login flow with almost no code.
Dấu hiệu nhận biết: bạn sắp viết “quên mật khẩu” và nhận ra nó đã là một magic link.Recognition cue: you’re about to build “forgot password” and realize it already is a magic link.
chính sách · chồng lên cơ chế có sẵnpolicy · layered on something else
MFA
Hai bằng chứng thuộc hai loại khác nhau: thứ bạn biết, thứ bạn có, thứ bạn là. Hai mật khẩu không phải MFA.Two pieces of evidence from different categories: something you know, have, or are. Two passwords are not MFA.
dùng chouse forMọi tài khoản quản trị. Hạ tầng sản xuất, kho mã nguồn, hệ thống thanh toán.Every admin account. Production infrastructure, source repos, payment systems.
đượcyou gainVô hiệu hoá gần hết tấn công dùng lại mật khẩu rò rỉ. Gắn thêm được vào hệ thống hiện có.Neutralizes nearly all credential-stuffing. Bolts onto an existing system.
mấtyou loseSMS yếu vì SIM swap. TOTP vẫn bị lừa đảo chuyển tiếp. Ticket khôi phục tài khoản tăng mạnh.SMS is weak against SIM swaps. TOTP is still relay-phishable. Recovery tickets climb sharply.
Chọn MFA là đổi vài giây ma sát mỗi lần đăng nhập cộng một dòng chi phí hỗ trợ thường trực lấy việc một mật khẩu bị lộ không còn đủ để vào.Choosing MFA trades seconds of friction per login plus a standing support cost for the guarantee that a leaked password alone is not enough.
Dấu hiệu nhận biết: bạn chấp nhận giả định “mật khẩu này sẽ có ngày bị lộ”.Recognition cue: you accept that this password will eventually leak.
03
Giữ trạng thái — “sau khi đăng nhập, bằng chứng nằm ở đâu?”Keeping state — “where does the proof live after login?”
mẫu thiết kế · trục thời gian sốngdesign pattern · the lifetime axis
API Key vs Token
Một bí mật tĩnh sống mãi cho tới khi có người xoá, so với một chuỗi có chữ ký, có hạn và có phạm vi.A static secret that lives until someone deletes it, versus a signed string with an expiry and a scope.
dùng chouse forKey: script nội bộ, CLI, tích hợp nhanh. Token: mọi tích hợp chạm vào dữ liệu người dùng.Keys: internal scripts, CLIs, quick integrations. Tokens: anything touching user data.
đượcyou gainKey dựng xong trong vài phút, debug bằng curl. Token giới hạn thiệt hại theo thời gian và theo phạm vi.Keys ship in minutes and debug with curl. Tokens cap damage by time and scope.
mấtyou loseKey lộ là sống vĩnh viễn, thường nằm trong lịch sử Git từ lâu. Token đòi hạ tầng cấp phát và làm mới.A leaked key lives forever, usually already in Git history. Tokens need issuing and refresh infrastructure.
Chọn API key là đổi khả năng giới hạn thiệt hại khi rò rỉ lấy sự đơn giản của một chuỗi ký tự dán vào là chạy.Choosing an API key trades the ability to bound the damage of a leak for the simplicity of a string you paste in and it works.
Dấu hiệu nhận biết: “nếu chuỗi này lên GitHub công khai lúc 2 giờ sáng thì đến sáng mai thiệt hại đến đâu?”Recognition cue: “if this string lands on public GitHub at 2am, how bad is it by morning?”
mẫu thiết kế · trục nơi lưu trạng tháidesign pattern · the state-location axis
Session vs Token Auth
Server nhớ và client cầm mã tra cứu, hay client cầm toàn bộ thông tin đã ký và server không nhớ gì.The server remembers and the client carries a lookup id, or the client carries signed facts and the server remembers nothing.
dùng chouse forSession: web app cần đăng xuất tức thì. Token: API không trạng thái, nhiều instance, nhiều dịch vụ.Sessions: web apps needing instant logout. Tokens: stateless APIs, many instances, many services.
đượcyou gainSession huỷ được tức thì. Token bỏ được một lần tra cứu trên mọi request và đi qua ranh giới dịch vụ dễ dàng.Sessions die instantly. Tokens remove a lookup per request and cross service boundaries easily.
mấtyou loseSession cần một kho dùng chung. JWT không thu hồi được trước hạn — mọi cách vá đều đưa trạng thái quay lại.Sessions need a shared store. JWTs can’t be revoked early — every workaround reintroduces state.
Chọn JWT không trạng thái là đổi khả năng đăng xuất tức thì lấy việc không phải tra cứu kho phiên ở mỗi request.Choosing stateless JWTs trades instant logout for not hitting a session store on every request.
Dấu hiệu nhận biết: “bấm đăng xuất thì phiên phải chết trong bao lâu?” Nếu là “ngay lập tức”, bạn cần session.Recognition cue: “when someone logs out, how fast must the session die?” If the answer is “immediately”, use sessions.
Bảng đánh đổiTrade-off table
Đọc cột đầu tiên trước: chỉ mTLS và passkey chống được lừa đảo mà không kèm điều kiện. Mọi cơ chế bearer còn lại đều có thể bị một trang giả mạo chuyển tiếp.Read the first column first: only mTLS and passkeys resist phishing unconditionally. Every other bearer-based mechanism can be relayed by a fake page.
chống lừa đảophishing-resistant
thu hồi tức thìinstant revocation
chi phí vận hànhoperational cost
ai giữ bí mậtwho holds the secret
OAuth 2.0
khôngno
cóyes
trung bìnhmedium
authorization server
OpenID Connect
theo IdPinherits IdP
theo IdPinherits IdP
thấplow
IdP
SAML
theo IdPinherits IdP
kémpoor
caohigh
IdP
SSO
theo IdPinherits IdP
có, tại IdPyes, at the IdP
caohigh
IdP
mTLS
cóyes
kémpoor
rất caovery high
cả hai phíaboth sides
Passkeys
cóyes
cóyes
thấplow
thiết bị người dùnguser’s device
Magic Link
khôngno
cóyes
rất thấpvery low
nhà cung cấp emailemail provider
MFA
tuỳ yếu tốdepends on factor
—
trung bìnhmedium
phân tándistributed
API Key
khôngno
có, nếu tìm ra keyyes, if you find it
rất thấpvery low
cả hai, dạng tĩnhboth, statically
Session
khôngno
cóyes
thấplow
server
JWT
khôngno
khôngno
thấplow
client
Sai lầm thường gặpAnti-patterns
sai lầmmistake
vì sao saiwhy it’s wrong
sửa thế nàofix
Dùng access token của OAuth làm bằng chứng danh tínhUsing an OAuth access token as proof of identity
Token không nói nó được cấp cho ai; token của app khác vẫn hợp lệThe token doesn’t say who it was issued to; another app’s token still validates
Dùng id_token của OIDC và kiểm tra audUse the OIDC id_token and check aud
Để JWT trong localStorageStoring JWTs in localStorage
Một lỗ XSS là mất toàn bộ tokenOne XSS bug hands over every token
Cookie HttpOnly; Secure; SameSiteUse HttpOnly; Secure; SameSite cookies
Tin trường alg trong JWTTrusting the JWT alg header
Tấn công alg: none và hạ cấp RS256 → HS256alg: none and RS256 → HS256 downgrade attacks
Cố định thuật toán trong code, dùng danh sách trắngHardcode the algorithm with an allowlist
SMS làm yếu tố thứ hai cho tài khoản adminSMS as the second factor for admins
SIM swap là dịch vụ mua đượcSIM swapping is a purchasable service
Khoá phần cứng hoặc passkeyHardware keys or passkeys
Magic link hạn 24 giờ, dùng lại được24-hour reusable magic links
Link nằm lâu trong hòm mail; bộ quét đốt mất tokenThe link sits in the mailbox; scanners burn the token
Hạn 15 phút, dùng một lần, yêu cầu POST15 minutes, single use, require a POST
So khớp redirect URI bằng prefixPrefix-matching redirect URIs
https://app.com.kesau.com khớp prefixhttps://app.com.attacker.com matches the prefix
So khớp chuỗi chính xác với danh sách đăng ký sẵnExact string match against a registered list
Khoá tài khoản vào email lấy từ OIDCKeying accounts on the OIDC email claim
Email đổi được và được tái cấp cho người khácEmails change and get reassigned
Khoá vào cặp (iss, sub)Key on the (iss, sub) pair
Chỉ có SSO, không có đường dự phòngSSO with no fallback path
IdP sập là không ai vào được, kể cả người đi sửaAn IdP outage locks out everyone, including whoever would fix it
Tài khoản break-glass, kiểm tra định kỳBreak-glass accounts, tested regularly
Quy trình khôi phục yếu hơn quy trình đăng nhậpRecovery weaker than login
Kẻ tấn công luôn đi cửa yếu hơnAttackers always take the weaker door
Siết khôi phục ngang mức đăng nhậpHarden recovery to match login
Ba câu cần nhớThree things to remember
OAuth 2.0 nói bạn được làm gì, OIDC mới nói bạn là ai. Nhầm hai thứ này là lỗi kiến trúc phổ biến nhất của cả lĩnh vực.OAuth 2.0 says what you may do; OIDC says who you are. Confusing the two is the most common architectural mistake in this field.
Chỉ mTLS và passkey chống được lừa đảo, vì bí mật không bao giờ băng qua ranh giới. Mọi cơ chế bearer còn lại đều có thể bị chuyển tiếp.Only mTLS and passkeys resist phishing, because the secret never crosses the boundary. Everything else bearer-based can be relayed.
Bắt đầu từ mật khẩu băm và session ở server. Chỉ thêm một lớp khi có yêu cầu cụ thể ép bạn thêm, không phải vì nó hiện đại hơn.Start with hashed passwords and server-side sessions. Add a layer only when a specific requirement forces you to, not because it sounds modern.