Khái niệm chia sẻ nguồn chéo
Hai URL được coi là cùng nguồn nếu chúng có cùng giao thức, cổng (nếu có) và tên miền. Ví dụ,
https://example.com/page1 và
https://example.com/page2 thuộc cùng một nguồn.
CORS là gì?
CORS (Cross-Origin Resource Sharing) là cơ chế cho phép tài nguyên trên trang web được truy cập từ các miền khác nhau. Cơ chế này giúp trình duyệt xác thực an toàn trước khi thực hiện yêu cầu chéo miền. Với CORS, các yêu cầu AJAX hoặc phương thức HTTP như POST, PUT sẽ được kiểm tra bằng cách gửi yêu cầu OPTIONS trước để xác định xem server có cho phép hay không.
Cách triển khai trong Go
Dưới đây là ví dụ sử dụng package
gin-gonic để tạo middleware xử lý CORS:
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
router := gin.Default()
// Middleware xử lý CORS
handleCORS := func(ctx *gin.Context) {
// Cho phép tất cả miền
ctx.Writer.Header().Set("Access-Control-Allow-Origin", "*")
// Các phương thức được phép
ctx.Writer.Header().Set("Access-Control-Allow-Methods", "GET, POST, PATCH, DELETE")
// Các header được phép
ctx.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Accept, Authorization")
// Cho phép gửi cookie
ctx.Writer.Header().Set("Access-Control-Allow-Credentials", "true")
// Tiếp tục xử lý request
ctx.Next()
}
// Áp dụng middleware cho toàn bộ route
router.Use(handleCORS)
// Route demo
router.GET("/test", func(ctx *gin.Context) {
ctx.String(http.StatusOK, "CORS đã được cấu hình")
})
router.Run(":8080")
}
Kết quả kiểm tra
Khi truy cập endpoint
/test, bạn sẽ thấy các header sau trong response:
HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Content-Type, Accept, Authorization
Access-Control-Allow-Methods: GET, POST, PATCH, DELETE
Access-Control-Allow-Origin: *
Content-Type: text/plain; charset=utf-8
Date: Mon, 16 Oct 2023 08:00:00 GMT
Content-Length: 20
CORS đã được cấu hình
Thử nghiệm với curl
Sử dụng lệnh sau để kiểm tra:
curl -i http://localhost:8080/test
Nếu thấy các header CORS trong output, nghĩa là cấu hình đã thành công.