OAuth 2.0 Hacking: Part 1 – Kiến thức cơ bản

09/07/2025

18

Trong quá trình đăng nhập trong 1 ứng dụng nào đó, khi bạn click vào nút "Sign in with Google" hoặc "Connect with Facebook", đằng sau đó không đơn giản là một hành động đăng nhập. Đó là sự khởi động của một giao thức bảo mật mang tên OAuth. Vậy OAuth thực sự là gì?

Tổng quan

OAuth là gì?

OAuth (Open Authorization) là một giao thức ủy quyền tiêu chuẩn mở, cho phép một ứng dụng bên thứ ba truy cập vào tài nguyên của bạn trên một dịch vụ khác — nhưng không cần biết hoặc lưu trữ mật khẩu của bạn.

Để hiểu định nghĩa trên 1 cách đơn giản, chúng ta có ví dụ sau: Bạn đang muốn đăng nhập vào 1 ứng dụng có tên là A. Trong ứng dụng A bạn thấy có 1 nút Đăng nhập với Google

  • Bước 1: Khi bạn ấn nút Đăng nhập với google, ứng dụng A sẽ yêu cầu Google cung cấp thông tin danh tính của bạn. Thông tin này có thể là: Tên, Email, SĐT, địa chỉ, …
  • Bước 2: Sau đó Google sẽ hiển thị giao diện hỏi bạn rằng: Ứng dụng A đang muốn lấy những thông tin Tên, Email, SĐT, địa chỉ, … bạn có đồng ý để ứng dụng A lấy những thông tin này không?
  • Bước 3: Khi bạn nhấn Tôi đồng ý ngay lập tức Google sẽ chấp nhận yêu cầu của ứng dụng A. Ứng dụng A có được thông tin của bạn, nó sẽ tự đăng ký tài khoản cho bạn nếu chưa có. Nếu bạn đã có tài khoản, ứng dụng A sẽ cho phép bạn đăng nhập.
  • Bước 4: OAuth xuất hiện thay vì bạn phải tự nhập các thông tin để đăng ký/đăng nhập vào ứng dụng A, thì bạn đã ủy quyền cho google làm điều đó thay bạn. Việc của bạn chỉ đơn giản là ấn nút Tôi đồng ý.

Trong ví dụ trên, ứng dụng A được gọi là ứng dụng bên thứ 3 hay là client, Google là Authorization và Resource Server.

  • LƯU Ý: OAuth không phải là cơ chế “đăng nhập”, nó là cơ chế ủy quyền quyền truy cập. Bạn ủy quyền cho Google cung cấp thông tin của bạn cho ứng dụng A

Tại sao OAuth ngày càng trở nên phổ biến và không thể thiếu trong các ứng dụng

Để biết tại sao OAuth ngày càng trở nên phổ biến và không thể thiếu đối với ứng dụng web/app hiện nay, ta phải nhắc đến lợi ích của nó đem lại

  • OAuth tối ưu trải nghiệm người dùng
  • Đăng nhập nhanh, không rào cản: Thay vì bắt người dùng tạo thêm một tài khoản mới, chỉ cần “Đăng nhập với Google/Facebook/Apple/ …” là xong ⇒ Tiết kiệm thời gian — Đăng nhập nhanh trong vài giây
  • Không cần nhớ thêm mật khẩu mới nữ
  • Bạn không cần nhớ thêm mật khẩu mới nữa, bạn chỉ cần nhớ mật khẩu của Google, việc đăng nhập vào ứng dụng khác chỉ cần ủy quyền cho Google, Google sẽ tự động hoàn thành việc xác thực bạn với ứng dụng
  • Điều này giúp dễ dàng đồng bộ giữa các ứng dụng

Bạn cài ứng dụng chỉnh sửa ảnh và muốn nó lưu ảnh thẳng vào Google Drive? Bạn dùng công cụ học tập và muốn nó tự động đồng bộ với lịch Google? OAuth giúp ứng dụng đó truy cập đúng vào dữ liệu bạn cho phép, mà không cần mật khẩu, không cần tải file thủ công.

Còn rất nhiều lợi ích nữa mà OAuth mang đến, và chung quy lại mục đích của nó là tạo ra sự tiện lợi giữa người dùng và các dịch vụ.

Cấu trúc của OAuth

OAuth gồm các thành phần chính:

Thành phầnVai trò
Resource OwnerChủ sở hữu tài nguyên
ClientỨng dụng bên thứ ba muốn truy cập tài nguyên
Authorization ServerServer xác thực và cấp token ủy quyền
Resource ServerNơi chứa tài nguyên (API, dữ liệu), kiểm tra token để cấp tài nguyên

Trong đó:

  1. Resource Owner – Chủ sở hữu tài nguyên có thể là:
    • Con người – khi OAuth được dùng để cho phép ứng dụng truy cập thay mặt cho người dùng.
    • Hệ thống – khi OAuth dùng trong môi trường máy nói chuyện với máy (server-to-server), không có con người tham gia
  2. Client là ứng dụng mà chúng ta đang muốn đăng nhập, là ứng dụng sẽ gửi yêu cầu xin thông tin danh tính của bạn tới google.
  3. Authorization Server – Máy chủ Ủy quyền: Là server chịu trách nhiệm xác thực Resource Owner và cấp Access Token cho Client khi được ủy quyền.
  4. Resource Server – Máy chủ Tài nguyên: Là server chứa các tài nguyên được bảo vệ, chịu trách nhiệm xác nhận Access Token của client và trả về dữ liệu tương ứng.

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

Khi nắm rõ được 4 thành phần cốt lõi của OAuth được trình bày ở phần trên, chúng ta tiếp tục đi vào phần cơ chế hoạt động của OAuth.

Protocol Flow của OAuth 2.0
Protocol Flow của OAuth 2.0

Giai đoạn 1: Lấy giấy phép

Nguyên lý kỹ thuậtThực tế phía người dùng
Client (ứng dụng) gửi yêu cầu đến Resource Owner (người dùng) để xin quyền truy cập dữ liệu.Người dùng được đưa tới trang Google/Facebook… với câu hỏi: “App A muốn truy cập vào email và thông tin cá nhân của bạn. Bạn có đồng ý không?”
  • Yêu cầu này thường đi qua Authorization Server (Google Auth, Facebook Auth), chứ không giao tiếp trực tiếp giữa Client và người dùng.

Ý chính: Client hỏi người dùng: “Tôi có thể truy cập dữ liệu của bạn không?”

Sau khi người dùng đồng ý, Resource Owner đã cấp cho Client một Authorization Grant (mã ủy quyền). Mã này là bằng chứng rằng người dùng đã đồng ý cho phép Client truy cập.

  • Client nhận được một tấm vé xác nhận: “Người dùng đã đồng ý cấp quyền.”

Giai đoạn 2: Lấy Access Token

Sau khi nhận được “giấy phép tạm thời” (Authorization Grant) ở bước B, Client (Ứng dụng A) sẽ gửi “giấy phép” này đến Máy chủ Ủy quyền (Authorization Server) của Facebook/Google để chứng minh nó đã được bạn cho phép.

Sau khi nhận được “giấy phép tạm thời” từ Client (Ứng dụng A), Máy chủ Ủy quyền (Authorization Server) sẽ tiến hành kiểm tra “giấy phép” này. Nếu hợp lệ, nó sẽ cấp cho Client một thứ gọi là Access Token.

Access Token giống như một chiếc “chìa khóa” thực sự. Chiếc chìa khóa này có thời hạn và có phạm vi quyền hạn nhất định (ví dụ: chỉ được đọc ảnh, không được xóa).

Giai đoạn 3: Truy cập tài nguyên

Tại đây, Client (ứng dụng A) đã có “chìa khóa” (Access Token). Nó sẽ dùng “chìa khóa” này để gửi yêu cầu đến Máy chủ Tài nguyên (Resource Server), và nói: “Hãy cho tôi Tên, email, sđt của người dùng này, đây là chìa khóa chứng minh tôi được phép”.

Máy chủ Facebook/Google (Resource Server) sẽ tiến hành kiểm tra “chìa khóa” (Access Token). Nếu “chìa khóa” hợp lệ, nó sẽ trả về dữ liệu được yêu cầu (các thông tin của bạn) cho ứng dụng A.

Các loại Authorization Grant trong OAuth

Có nhiều cách để triển khai luồng OAuth, trong đó sự khác biệt của các cách triển khai OAuth sẽ tập trung tại bước (B), (C), (D) liên quan đến khái niệm Authorization Grant:

Trong OAuth có 4 loại triển khai Authorization Grant đó là:

Sử dụng khi nào?Đặc điểm chính
Authorization CodeỨng dụng web SSR/CSR, App mobile/desktopNgười dùng đăng nhập → Client Nhận Code → Client đổi Code lấy Token ở Backend
ImplicitỨng dụng web SSR/CSR, App mobile/desktopNgười dùng đăng nhập → Nhận ngay Token trên trình duyệt
Resource Owner PasswordỨng dụng “chính chủ”Ứng dụng lấy trực tiếp username & password của người dùng
Client CredentialsMachine-to-Machine (M2M)Ứng dụng tự xác thực để lấy Token. Không có người dùng.

Authorization Code

  • Sử dụng khi nào? Các ứng dụng web truyền thống có máy chủ (server-side applications)
  • Đặc điểm chính:
  • Ứng dụng chuyển hướng người dùng đến trang đăng nhập của nhà cung cấp (Google, Facebook…).
  • Sau khi người dùng đồng ý, ứng dụng client sẽ được resource owner cấp cho 1 mã Authorization Code
  • Ứng dụng dùng Code này cùng với Client Secret của nó gửi đến Authorization Server để trao đổi lấy Access Token trên một kênh bảo mật (server-to-server).
  • Sau đó ứng dụng client sẽ sử dụng Access Token để gửi đến Resource Server để lấy về dữ những dữ liệu nằm trong Scope
  • Vấn đề an toàn:
  • Access Token không bao giờ được phép lộ trên trình duyệt của người dùng. Nó được chỉ được phép truyền trực tiếp giữa máy chủ ứng dụng và máy chủ Resource Server.
  • Yêu cầu ứng dụng phải xác thực chính nó (bằng Client ID & Client Secret), đảm bảo chỉ có ứng dụng hợp lệ mới đổi được Code lấy token.
  • Đây là luồng an toàn và được khuyến khích nhất khi có thể.

Implicit

  • Sử dụng khi nào? Các ứng dụng chạy hoàn toàn trên trình duyệt của người dùng, sử dụng JavaScript (Single-Page Applications – SPA) hoặc các ứng dụng chạy trên App mobile/desktop
  • Đặc điểm chính:
  • Tương tự như trên, ứng dụng chuyển hướng người dùng đến trang đăng nhập.
  • Điểm khác biệt lớn: Sau khi người dùng đồng ý, máy chủ resource owner trả về Access Token trực tiếp cho trình duyệt, bỏ qua bước Authorization Code.
  • Sau đó ứng dụng client sẽ sử dụng luôn Access Token này gửi đến Resource Server để lấy về dữ những dữ liệu nằm trong Scope
  • Vấn đề an toàn:
  • Access Token bị lộ trên trình duyệt: Nó nằm trong thanh địa chỉ URL, lịch sử trình duyệt, và có thể bị các script độc hại khác trên trang web đánh cắp (tấn công XSS).
  • Máy chủ ủy quyền không xác thực ứng dụng, vì ứng dụng chạy trên trình duyệt không thể giữ bí mật (Client Secret). Nó chỉ có thể dựa vào Redirection URI để xác minh.
  • Luồng này đơn giản hơn và nhanh hơn (ít bước hơn) nhưng kém an toàn hơn đáng kể. Ngày nay, nó không còn được khuyến khích sử dụng. Thay vào đó, các ứng dụng SPA hiện đại nên dùng luồng Authorization Code với PKCE (một biến thể an toàn hơn).

Resource Owner Password Credentials

  • Sử dụng khi nào? Chỉ dành cho các ứng dụng được tin tưởng tuyệt đối, thường là ứng dụng client do chính nhà cung cấp dịch vụ ủy quyền tạo ra. Có thể hiểu, tất cả các đối tượng trong quá trình xác thực và ủy quyền này đều thuộc về 1 nhà cung cấp
  • Đặc điểm chính:
  • Ứng dụng Client hiển thị một form đăng nhập và yêu cầu người dùng nhập username và password của họ. (Resource Owner lúc này chính là người dùng đang muốn đăng nhập)
  • Sau đó, Client gửi thẳng username và password này đến Máy chủ Ủy quyền để đổi lấy Access Token.
  • Điều này chỉ chấp nhận được khi Ứng dụng Client và dịch vụ Authorization đều thuộc cùng một  hệ sinh thái
  • Vấn đề an toàn:
  • Khi ứng dụng client và dịch vụ ủy quyền không cùng nằm trong 1 hệ sinh thái, ứng dụng client có thể có những hành động như ăn cắp username/password của Resource Owner (người dùng), vì client trực tiếp xử lý username/password. Gây ra chiếm đoạt tài khoản, lộ lọt thông tin
  • Chỉ sử dụng trong trường hợp bất khả kháng khi client và server có mức độ tin cậy rất cao. Tuyệt đối tránh với các ứng dụng của bên thứ ba.

Client Credentials

  • Sử dụng khi nào? Giao tiếp giữa các máy chủ (machine-to-machine, M2M), không có con người tham gia vào quá trình này.
  • Đặc điểm chính:
  • Ứng dụng (Client) tự hành động nhân danh chính nó, không phải nhân danh một người dùng nào cả.
  • Nó dùng Client ID và Client Secret của chính mình để yêu cầu một Access Token từ máy chủ ủy quyền. Token này cấp quyền truy cập vào các tài nguyên mà chính ứng dụng đó sở hữu hoặc đã được cấp phép từ trước.
  • Ví dụ: Một microservice “Báo Cáo” cần lấy dữ liệu từ microservice “Đơn Hàng” vào mỗi đêm để tổng hợp. Service “Báo Cáo” sẽ dùng luồng này để tự lấy Access Token và gọi đến API của service “Đơn Hàng”. Không có người dùng nào phải đăng nhập hay đồng ý ở đây cả.
  • Rất hữu ích cho các tác vụ tự động, chạy ngầm, hoặc giao tiếp giữa các thành phần backend trong một hệ thống.

Kết luận

Qua bài viết này, chúng ta đã cùng nhau khám phá toàn bộ những kiến thức nền tảng của OAuth — từ khái niệm, lý do tại sao nó trở thành tiêu chuẩn bảo mật quan trọng trong thế giới số hiện đại, cho đến cách thức hoạt động chi tiết của giao thức này.

OAuth không chỉ giúp người dùng an toàn hơn khi sử dụng dịch vụ trực tuyến, mà còn mang lại khả năng kết nối, tích hợp và bảo mật cực kỳ mạnh mẽ giữa các ứng dụng và hệ thống.

Tuy nhiên, OAuth không chỉ đơn giản dừng lại ở cơ chế xin cấp quyền và cấp token. Để phù hợp với nhiều tình huống sử dụng khác nhau — từ ứng dụng web, mobile, API backend cho đến hệ thống server-to-server — OAuth thiết kế ra 4 loại Authorization Grant chính, mỗi loại có một luồng hoạt động riêng, ưu nhược điểm và kịch bản sử dụng khác nhau.

Ở bài blog tiếp theo, chúng ta sẽ đi sâu vào chi tiết 4 luồng hoạt động chính của OAuth bao gồm:

  • Authorization Code Flow – Luồng mã ủy quyền, phổ biến nhất trong các ứng dụng
  • Implicit Flow – Luồng ngầm, được thiết kế cho ứng dụng web thuần frontend nhưng hiện nay dần bị thay thế.
  • Resource Owner Password Credentials Flow – Luồng dùng trực tiếp username/password, ít khuyến khích do rủi ro bảo mật cao.
  • Client Credentials Flow – Luồng dành cho giao tiếp server-to-server, không có sự tham gia của người dùng.

OAuth 2.0 Hacking: Part 2
Nguyễn Giang Nam

Nguyễn Giang Nam

Cyber Security Specialist

Cùng nhau bảo vệ

Logo

Không gian mạng

Logo

cho doanh nghiệp của bạn