Tan Phat Media

CORS Checker

Kiểm tra CORS headers của API endpoint

Kiểm tra CORS

Browser sẽ dùng origin hiện tại của trang khi gửi request.

CORS là gì?

CORS (Cross-Origin Resource Sharing) là cơ chế bảo mật cho phép hoặc chặn requests từ domain khác.

Khi browser gửi request đến API khác domain, server cần trả về CORS headers phù hợp để browser cho phép response.

Hợp tác ngay với Tấn Phát Digital

Chúng tôi không chỉ thiết kế website, mà còn giúp doanh nghiệp xây dựng thương hiệu số mạnh mẽ. Cung cấp dịch vụ thiết kế website trọn gói từ thiết kế đến tối ưu SEO. Hãy liên hệ ngay với Tấn Phát Digital để cùng tạo nên những giải pháp công nghệ đột phá, hiệu quả và bền vững cho doanh nghiệp của bạn tại Hồ Chí Minh.

Kiểm tra CORS của một endpoint: đọc kết quả đúng và hiểu giới hạn của phép thử

Công cụ gửi một yêu cầu thật từ trình duyệt của bạn tới địa chỉ API bạn nhập, rồi cho biết trình duyệt có chấp nhận phản hồi hay bị chính sách cùng nguồn chặn lại, kèm các tiêu đề Access-Control đọc được. Đây là phép thử nhanh để trả lời câu hỏi endpoint này có gọi được từ trang web khác hay không.

Tính năng nổi bật

  • Gửi yêu cầu thật từ trình duyệt tới địa chỉ bạn nhập, không qua máy chủ trung gian
  • Chọn phương thức trong danh sách GET, POST, PUT, DELETE, PATCH và OPTIONS
  • Kết luận rõ ràng bằng màu và biểu tượng: trình duyệt chấp nhận hay bị chặn
  • Liệt kê sáu tiêu đề Access-Control quan trọng nhất kèm giá trị đọc được
  • Hiển thị Access-Control-Allow-Origin, Allow-Methods và Allow-Headers
  • Hiển thị Allow-Credentials, Max-Age và Expose-Headers
  • Có ô ghi nguồn gốc mong muốn để bạn đối chiếu với cấu hình dự kiến
  • Không lưu địa chỉ bạn nhập và không gửi nó tới bất cứ dịch vụ nào khác

Lỗi CORS là loại lỗi mà thông báo không nói gì hữu ích

Khi trình duyệt chặn một yêu cầu vì lý do CORS, thứ mà mã JavaScript của bạn nhận được chỉ là một lỗi mạng chung chung, không có mã trạng thái và không có nội dung phản hồi. Đây là thiết kế cố ý: nếu trình duyệt tiết lộ chi tiết phản hồi cho trang không được phép đọc thì chính sách bảo vệ đã mất tác dụng. Hệ quả là lập trình viên đứng trước một dòng lỗi giống hệt nhau cho mấy tình huống hoàn toàn khác nhau: máy chủ chưa cấu hình CORS, máy chủ có cấu hình nhưng không cho nguồn gốc của bạn, yêu cầu kiểm tra trước bị từ chối, hoặc đơn giản là địa chỉ sai và máy chủ không tồn tại. Chạy thử endpoint bằng một công cụ tách rời khỏi ứng dụng giúp bạn khoanh vùng nhanh: nếu ở đây cũng bị chặn thì vấn đề nằm ở phía máy chủ, còn nếu ở đây qua được thì vấn đề nằm trong cách ứng dụng của bạn gửi yêu cầu, thường là ở tiêu đề tùy chỉnh hoặc kiểu nội dung.

Lợi ích khi sử dụng

  • Khoanh vùng nhanh xem lỗi nằm ở phía máy chủ hay ở cách ứng dụng gửi yêu cầu
  • Xác nhận endpoint công khai có thật sự gọi được từ trình duyệt hay không
  • Không cần viết một trang thử nghiệm riêng chỉ để chạy một lời gọi kiểm tra
  • Kết quả trả về từ chính trình duyệt bạn đang dùng, đúng môi trường thật
  • Dùng được ngay trên máy không cài công cụ dòng lệnh nào

Cách kiểm tra CORS của một endpoint

  1. 1Dán địa chỉ đầy đủ của endpoint cần kiểm tra, gồm cả giao thức https và đường dẫn chính xác.
  2. 2Chọn phương thức, để GET nếu bạn muốn thử một yêu cầu đơn giản, chọn phương thức khác để công cụ gửi yêu cầu OPTIONS.
  3. 3Bấm nút kiểm tra và chờ kết quả, thao tác này gửi một yêu cầu thật nên đừng nhắm vào endpoint có tác dụng thay đổi dữ liệu.
  4. 4Đọc dòng kết luận trước: đó là câu trả lời cho câu hỏi trình duyệt có được phép đọc phản hồi hay không.
  5. 5Xem tiếp các dòng tiêu đề, nhưng nhớ rằng chúng thường để trống ngay cả khi máy chủ đã cấu hình đúng, vì lý do giải thích ở phần bên dưới.

CORS chặn khi nào và không chặn khi nào

Hai địa chỉ được coi là cùng nguồn gốc khi trùng nhau cả ba thứ: giao thức, tên miền và cổng. Chỉ cần khác một trong ba là khác nguồn gốc, nên http và https của cùng một tên miền vẫn là hai nguồn khác nhau, và cổng 3000 với cổng 8080 trên localhost cũng vậy — đây chính là lý do lỗi CORS xuất hiện ngay khi lập trình trên máy cá nhân. Với yêu cầu khác nguồn gốc, trình duyệt chia làm hai nhóm. Nhóm yêu cầu đơn giản gồm GET, HEAD và POST với kiểu nội dung thuộc ba loại cơ bản, không có tiêu đề tùy chỉnh; nhóm này được gửi thẳng, máy chủ chỉ cần trả về đúng Access-Control-Allow-Origin là xong. Nhóm còn lại buộc trình duyệt gửi trước một yêu cầu kiểm tra bằng phương thức OPTIONS để hỏi phép, rồi mới gửi yêu cầu thật nếu được chấp thuận. Ba thứ hay kích hoạt bước kiểm tra trước là phương thức PUT, DELETE hoặc PATCH, kiểu nội dung dạng JSON, và tiêu đề xác thực Authorization. Điều quan trọng cuối cùng: CORS chỉ do trình duyệt thi hành. Gọi từ dòng lệnh hay từ máy chủ này sang máy chủ khác thì không có ràng buộc nào, nên chuyện chạy được ở Postman mà hỏng trên trình duyệt là hoàn toàn bình thường.

Sáu tiêu đề phản hồi và ý nghĩa từng cái

Access-Control-Allow-Origin cho biết nguồn gốc nào được phép đọc phản hồi, giá trị có thể là dấu sao cho mọi nguồn hoặc đúng một địa chỉ cụ thể — chuẩn không cho phép liệt kê nhiều địa chỉ cách nhau bằng dấu phẩy, nên muốn cho nhiều nguồn thì máy chủ phải đọc nguồn gốc trong yêu cầu rồi trả lại đúng nó. Access-Control-Allow-Methods liệt kê các phương thức được chấp nhận, chỉ có ý nghĩa trong phản hồi của bước kiểm tra trước. Access-Control-Allow-Headers liệt kê các tiêu đề mà phía gọi được phép gửi kèm; thiếu Authorization hoặc Content-Type trong danh sách này là nguyên nhân rất phổ biến khiến bước kiểm tra trước thất bại. Access-Control-Allow-Credentials bật lên khi máy chủ chấp nhận yêu cầu mang theo cookie hoặc thông tin xác thực. Access-Control-Max-Age cho biết trình duyệt được nhớ kết quả kiểm tra trước trong bao lâu để khỏi hỏi lại mỗi lần, nhưng các trình duyệt đều áp trần riêng nên đặt giá trị rất lớn cũng không kéo dài thêm được. Access-Control-Expose-Headers liệt kê những tiêu đề phản hồi mà mã JavaScript được phép đọc ngoài danh sách mặc định.

Phép thử này kiểm được gì và không kiểm được gì

Đây là phần quan trọng nhất cần đọc kỹ để không hiểu sai kết quả. Thứ nhất, nguồn gốc gửi đi luôn là tên miền của chính trang này, không phải tên miền bạn gõ vào ô nguồn gốc mong muốn — trình duyệt tự đặt tiêu đề Origin và không cho JavaScript sửa. Nghĩa là nếu máy chủ chỉ cho phép đúng tên miền của bạn, kết quả ở đây sẽ là bị chặn dù cấu hình hoàn toàn đúng. Thứ hai, và trái khoáy nhất, các dòng tiêu đề Access-Control thường hiện trống ngay cả khi máy chủ đã trả về đầy đủ: chính cơ chế CORS chỉ cho phép JavaScript đọc một nhóm nhỏ tiêu đề phản hồi, và nhóm Access-Control không nằm trong đó trừ khi máy chủ tự liệt kê chúng vào Expose-Headers. Vì vậy hãy coi dòng kết luận là kết quả chính, còn các dòng tiêu đề là phần thưởng nếu có. Thứ ba, khi bạn chọn phương thức khác GET, công cụ gửi thẳng một yêu cầu OPTIONS chứ không mô phỏng đúng bước kiểm tra trước, vốn phải kèm thêm hai tiêu đề khai báo phương thức và danh sách tiêu đề dự định dùng. Thứ tư, kết quả bị chặn còn có thể do máy chủ không tồn tại, tên miền sai hoặc lỗi mạng, vì trình duyệt trả về cùng một lỗi cho mọi trường hợp.

Sáu lỗi cấu hình CORS thường gặp

Một là dùng dấu sao trong Allow-Origin đồng thời bật Allow-Credentials. Tổ hợp này bị chuẩn cấm tuyệt đối; muốn nhận cookie, máy chủ bắt buộc phải trả về đúng một địa chỉ cụ thể. Hai là đọc nguồn gốc từ yêu cầu rồi trả lại mà quên thêm tiêu đề Vary với giá trị Origin; hậu quả là bộ nhớ đệm trung gian lưu phản hồi dành cho nguồn gốc này rồi phục vụ cho nguồn gốc khác, gây lỗi lúc có lúc không rất khó truy vết. Ba là chỉ gắn tiêu đề CORS cho phản hồi thành công mà quên các phản hồi lỗi; khi đó lỗi 500 của máy chủ hiện lên phía trình duyệt thành lỗi CORS, khiến người sửa đi nhầm hướng hoàn toàn. Bốn là để bước kiểm tra trước bị chuyển hướng, điều mà chuẩn không cho phép — hay gặp khi máy chủ tự chuyển hướng từ địa chỉ không có dấu gạch chéo cuối sang địa chỉ có. Năm là quên liệt kê tiêu đề Authorization trong Allow-Headers dù API dùng mã thông báo. Sáu là chặn phương thức OPTIONS ở tầng tường lửa hoặc yêu cầu xác thực cho cả OPTIONS, khiến bước kiểm tra trước không bao giờ qua được.

Cách xử lý khi ứng dụng của bạn dính lỗi CORS

Cách đúng và bền nhất là cấu hình ở phía máy chủ trả về dữ liệu: thêm nguồn gốc của bạn vào danh sách cho phép, khai đủ phương thức và tiêu đề, và nhớ áp dụng cho cả phản hồi lỗi. Nếu máy chủ đó không thuộc quyền kiểm soát của bạn, cách thay thế là dựng một lớp trung chuyển nằm cùng nguồn gốc với giao diện: trình duyệt gọi tới đường dẫn trên chính tên miền của bạn, máy chủ của bạn gọi tiếp ra bên ngoài rồi trả kết quả về. Vì lời gọi giữa hai máy chủ không chịu ràng buộc CORS, cách này luôn hoạt động, đồng thời cho bạn chỗ để giấu khóa API thay vì để lộ trong mã trình duyệt. Trong môi trường phát triển, hầu hết công cụ dựng dự án đều có sẵn cấu hình chuyển tiếp yêu cầu để tránh chuyện khác cổng. Còn về các tiện ích mở rộng tắt kiểm tra CORS của trình duyệt: chúng chỉ nên dùng để thử nhanh trong lúc gỡ lỗi, tuyệt đối không dùng như giải pháp, vì chúng vô hiệu hóa một lớp bảo vệ cho toàn bộ hoạt động duyệt web của bạn và cũng không giúp gì cho người dùng thật.

Câu hỏi thường gặp (FAQ)

CORS là gì?

Đó là cơ chế do trình duyệt thi hành, quy định khi nào một trang web được phép đọc dữ liệu từ một nguồn gốc khác. Mặc định trình duyệt chặn, và chỉ mở khi máy chủ bên kia trả về tiêu đề cho phép. Mục đích là ngăn một trang độc hại đọc trộm dữ liệu từ các dịch vụ mà bạn đang đăng nhập.

Vì sao gọi API chạy được ở Postman mà hỏng trên trình duyệt?

Vì CORS chỉ do trình duyệt thi hành, không phải do máy chủ chặn. Postman, curl hay lời gọi giữa hai máy chủ đều không kiểm tra tiêu đề CORS nên luôn nhận được dữ liệu. Kết quả khác nhau giữa hai môi trường là dấu hiệu chắc chắn rằng vấn đề nằm ở cấu hình CORS chứ không ở API.

Vì sao các dòng tiêu đề trong kết quả để trống?

Vì chính cơ chế CORS chỉ cho phép JavaScript đọc một nhóm nhỏ tiêu đề phản hồi, và nhóm Access-Control không nằm trong nhóm đó trừ khi máy chủ tự liệt kê chúng vào Access-Control-Expose-Headers. Hãy đọc dòng kết luận làm kết quả chính, còn các dòng tiêu đề là phần bổ sung nếu có.

Ô nguồn gốc mong muốn có tác dụng gì?

Chỉ để bạn ghi lại nguồn gốc dự kiến mà đối chiếu, nó không thay đổi yêu cầu gửi đi. Trình duyệt tự đặt tiêu đề Origin bằng tên miền của trang đang chạy và không cho JavaScript sửa, nên phép thử này luôn xuất phát từ tên miền của công cụ chứ không phải từ tên miền của bạn.

Yêu cầu kiểm tra trước xuất hiện khi nào?

Khi yêu cầu không thuộc nhóm đơn giản. Ba nguyên nhân phổ biến nhất là dùng phương thức PUT, DELETE hoặc PATCH; gửi kiểu nội dung dạng JSON; và kèm tiêu đề tùy chỉnh như Authorization. Khi đó trình duyệt tự gửi trước một yêu cầu OPTIONS để hỏi phép rồi mới gửi yêu cầu thật.

Đặt Access-Control-Allow-Origin bằng dấu sao có an toàn không?

An toàn với API công khai không yêu cầu xác thực, chẳng hạn dữ liệu mở hay tài liệu tra cứu. Không an toàn với API trả về dữ liệu riêng tư. Ngoài ra chuẩn cấm dùng dấu sao khi bật Allow-Credentials, nên nếu API cần nhận cookie thì bắt buộc phải trả về đúng một địa chỉ cụ thể.

Cho phép nhiều tên miền cùng lúc thì khai thế nào?

Chuẩn không cho phép liệt kê nhiều địa chỉ cách nhau bằng dấu phẩy trong một tiêu đề. Cách đúng là máy chủ đọc tiêu đề Origin của yêu cầu, so với danh sách cho phép của mình, rồi trả lại đúng địa chỉ đó. Nhớ thêm tiêu đề Vary với giá trị Origin để bộ nhớ đệm không phục vụ nhầm.

Vì sao lỗi CORS chỉ xảy ra thỉnh thoảng?

Dấu hiệu điển hình của việc thiếu tiêu đề Vary với giá trị Origin. Máy chủ trả về địa chỉ theo từng nguồn gốc nhưng bộ nhớ đệm trung gian lại lưu một bản duy nhất, nên phản hồi dành cho nguồn gốc này bị phục vụ cho nguồn gốc khác. Thêm tiêu đề Vary là xử lý được.

Lỗi 500 của máy chủ hiện thành lỗi CORS là sao?

Do máy chủ chỉ gắn tiêu đề CORS cho phản hồi thành công mà bỏ qua phản hồi lỗi. Khi đó trình duyệt chặn phản hồi lỗi và mã JavaScript không đọc được mã trạng thái, chỉ thấy lỗi mạng. Hãy cấu hình tiêu đề CORS ở lớp ngoài cùng để mọi phản hồi đều có, kể cả 4xx và 5xx.

Localhost cổng khác nhau có bị tính là khác nguồn gốc không?

Có. Nguồn gốc gồm cả cổng, nên localhost cổng 3000 và localhost cổng 8080 là hai nguồn gốc khác nhau và bị CORS ràng buộc bình thường. Trong môi trường phát triển, cách gọn nhất là dùng cấu hình chuyển tiếp yêu cầu có sẵn trong công cụ dựng dự án của bạn.

Có nên dùng tiện ích tắt CORS của trình duyệt không?

Chỉ dùng để thử nhanh trong lúc gỡ lỗi, tuyệt đối không coi là giải pháp. Nó vô hiệu hóa một lớp bảo vệ cho toàn bộ hoạt động duyệt web của bạn, và quan trọng hơn là nó không giúp gì cho người dùng thật vì họ không cài tiện ích đó. Vấn đề vẫn còn nguyên trên bản chạy thật.

Công cụ có gửi địa chỉ tôi nhập tới máy chủ của các bạn không?

Không. Yêu cầu được gửi thẳng từ trình duyệt của bạn tới địa chỉ bạn nhập, không đi qua máy chủ trung gian nào và không được ghi lại. Đổi lại, hãy nhớ đây là một yêu cầu thật nên đừng nhắm vào endpoint có tác dụng tạo, sửa hay xóa dữ liệu.

Từ khóa liên quan

  • kiểm tra cors
  • cors checker online
  • lỗi cors là gì
  • access-control-allow-origin
  • cách sửa lỗi cors
  • preflight request là gì
  • cors preflight options
  • cors với credentials cookie
  • vary origin header
  • cors localhost khác port
  • same-origin policy
  • access-control-allow-headers
  • access-control-max-age
  • cors expose headers
  • proxy để tránh lỗi cors
  • postman chạy được browser lỗi cors
  • cấu hình cors nginx
  • cors trong api backend
  • công cụ debug api online
  • tắt cors trình duyệt có nên không

Công cụ Developer Tools liên quan

.env Generator

Tạo file .env và .env.example cho dự án.

.gitignore Generator

Tạo .gitignore cho Node.js, Python, Java.

API Mock Generator

Tạo mock JSON data cho API testing.

API Response Formatter

Format và phân tích API response.

API Tester

Test REST API: GET, POST, PUT, DELETE.

Postman Alternative - API Testing Tool Online với Collections, Environment & File Upload

Postman Alternative miễn phí - Test APIs với Collections, Multiple Environments, Pre-request Scripts, Collection Runner, File Upload (form-data), Tests/Assertions, Code Generation (cURL, JS, Python, Node.js). Browser-based, không cần cài đặt. Save requests, export/import collections, auto-save history. Hỗ trợ Bearer Token, Basic Auth, API Key. Hoàn hảo cho API development và testing.

Swagger API Tester - Test API với OpenAPI/Swagger Spec & Authentication Online

Swagger API Tester miễn phí - Import OpenAPI/Swagger specification và test API endpoints với đầy đủ authentication (Bearer Token/JWT, Basic Auth, API Key). Hỗ trợ OpenAPI 3.0, Swagger 2.0, auto-parse endpoints, parameters, request body. Giao diện như Swagger UI với color-coded methods, grouped endpoints, real-time testing. Hoàn hảo cho API development, testing, debugging secured APIs.

Base Converter

Chuyển đổi Binary, Hex, Base32.

Base64 Encoder

Mã hóa/giải mã Base64.

Binary Converter

Chuyển đổi Decimal, Binary, Hex.

Box Shadow Generator

Tạo CSS box-shadow trực quan.

Chmod Calculator

Tính quyền file Linux.

Dịch vụ của Tấn Phát Digital

Đang xây sản phẩm và cần thêm người làm phần nặng?

Gói giải pháp doanh nghiệp

Nền tảng custom cho ngân hàng, y tế và sàn B2B, chuẩn ISO 27001, GDPR, PCI-DSS, SLA 99.99%.

Từ 50.000.000đXem chi tiết →

Dịch vụ phát triển Blockchain & Web3

Smart contract, dApp và NFT marketplace đa chuỗi, audit bảo mật đầy đủ trước khi lên mainnet.

Từ 50.000.000đXem chi tiết →

Dịch vụ thiết kế website tại Hồ Chí Minh

Website doanh nghiệp, bán hàng và đặt lịch, chuẩn SEO ngay từ cấu trúc, tốc độ tải dưới 3 giây.

Từ 5.000.000đXem chi tiết →

Dịch vụ thiết kế landing page

Trang đích riêng cho từng chiến dịch quảng cáo, tỷ lệ chuyển đổi 3–8%, bàn giao trong 5–21 ngày.

Từ 3.000.000đXem chi tiết →

Tư vấn và báo giá miễn phí trong 24 giờ. Xem toàn bộ dịch vụ

Zalo
Facebook
Tấn Phát Digital
Zalo
Facebook