Chuyện về việc "chốt đơn" với API: Từ REST đến GraphQL và cái "đau" của OAuth
Hôm nay ngồi cafe, bỗng nhiên nhớ lại project nhỏ mình làm hồi đầu năm, khi mà mình phải tích hợp một payment gateway mới. Cái thời điểm ấy, mình nghĩ REST API là "thần thánh", đơn giản, dễ hiểu, ai cũng biết dùng GET, POST là chạy. Nhưng càng làm càng thấy... khổ sở.
Vấn đề không nằm ở việc gọi API, mà nằm ở việc over-fetching và under-fetching. Ví dụ, mình cần thông tin đơn hàng: mã đơn, tổng tiền, và trạng thái. Nhưng API REST trả về cả tên khách, địa chỉ, lịch sử mua hàng, và cả danh sách sản phẩm chi tiết. Dữ liệu dư thừa ấy làm request nặng nề, tốn bandwidth, mà đôi khi lại phải gọi thêm một API khác để lấy cái thiếu (nỗi đau của N+1 query). Lúc đó mình mới bắt đầu "gật gù" đầu gật gật với GraphQL.
Chuyển sang GraphQL, ban đầu cũng lóng ngóng vì phải định nghĩa schema, resolver, nhưng cái cảm giác được "cherry-pick" dữ liệu theo ý mình thật sự dễ chịu. Thay vì gọi 3 endpoint khác nhau như ngày xưa, giờ mình chỉ cần một query:
query { order(id: "12345") { total status product { name price } } }
Nhưng rồi, khi làm xong phần logic dữ liệu, mình lại vấp phải vấn đề bảo mật với OAuth 2.0. Đúng là tiêu chuẩn vàng, nhưng documentation đọc mà như đọc kinh Phật. Khái niệm Authorization Code Flow, Client Credentials, hay Refresh Token khiến mình mất mấy ngày chỉ để debug cái lỗi 401 Unauthorized vô tận.
Một lần, mình code được, chạy thử thì OK, nhưng deploy lên production thì lỗi tùm lum. Hóa ra là do xử lý JWT sai cách, để lộ access token trong local storage, dễ bị XSS đánh. Lúc đó mới thấm thía: Công nghệ tốt chưa chắc đã an toàn nếu người dùng không hiểu bản chất.
Còn WebSocket thì sao? Mình chỉ dùng khi cần real-time update, kiểu như chat hay dashboard theo dõi đơn hàng đang giao. Nhưng nhớ là đừng lạm dụng nhé! Đừng cố dùng WebSocket để làm mọi thứ, nếu chỉ cần polling định kỳ hay server-sent events là đủ thì cứ làm cho gọn, đừng tạo kết nối dài hàng triệu người cùng lúc gây sập server.
Tóm lại, không có công nghệ nào là "thần thánh" tuyệt đối. REST thì ổn cho CRUD đơn giản, GraphQL thì hay cho data phức tạp, OAuth là bắt buộc cho bảo mật, còn WebSocket thì dành cho real-time. Quan trọng là chọn đúng công cụ cho đúng bài toán. Đôi khi, một giải pháp "ngầu" có thể biến thành cơn ác mộng nếu bạn không hiểu sâu về nó. Hy vọng anh em bớt "nỗi đau" khi debug API như mình nhé!