hocvietcode.com
  • Trang chủ
  • Học lập trình
    • Lập trình C/C++
    • Cấu trúc dữ liệu và giải thuật
    • Lập trình HTML
    • Lập trình Javascript
      • Javascript cơ bản
      • ReactJS framework
      • AngularJS framework
      • Typescript cơ bản
      • Angular
      • NodeJS
    • Lập trình Mobile
      • Lập Trình Dart Cơ Bản
        • Dart Flutter Framework
    • Cơ sở dữ liệu
      • MySQL – MariaDB
      • Micrsoft SQL Server
      • Extensible Markup Language (XML)
      • JSON
      • MongoDB
    • Lập trình PHP
      • Lập trình PHP cơ bản
      • Laravel Framework
    • Lập trình Java
      • Java Cơ bản
      • Spring Boot
    • Lập trình C#
      • Lập Trình C# Cơ Bản
      • ASP.NET Core MVC
    • Lập trình Python
    • Git và Github
    • Machine Learning
  • WORDPRESS
    • WordPress cơ bản
    • WordPress nâng cao
    • Chia sẻ WordPress
  • Kiến thức hệ thống
    • Microsoft Azure
    • Docker
    • Linux
    • Mạng và truyền thông
  • Chia sẻ IT
    • Tin học văn phòng
      • Microsoft Word
      • Microsoft Excel
    • Marketing
      • Google Adwords
      • Facebook Ads
      • Kiến thức khác
    • Chia sẻ phần mềm
    • Review công nghệ
    • Công cụ – tiện ích
      • Kiểm tra bàn phím online
      • Kiểm tra webcam online
Đăng nhập
  • Đăng nhập / Đăng ký

Please enter key search to display results.

Home
  • Spring Boot
Spring Boot bài 19: CSRF, CORS và gọi API có session đúng cách
Java và Spring Boot – MVC và REST API

Spring Boot bài 19: CSRF, CORS và gọi API có session đúng cách

  • 18-10-2026
  • Toanngo92
  • 0 Comments

Giáo trình Spring Boot MVC và REST API · Chương 8/12: Đăng nhập, phân quyền và bảo vệ request · Bài 19/28 · Biên soạn tháng 10/2026.

← Bài 18 · Mục lục 12 chương · Bài 20 →

Mục lục

  • Mục tiêu bài học
  • CSRF bảo vệ request dùng thông tin xác thực tự gửi
  • Token và session đi cùng nhau
  • CORS là chính sách trình duyệt, không phải đăng nhập
  • Chẩn đoán có thứ tự
  • Lỗi thường gặp và lưu ý
  • Ghi nhớ
  • Tài liệu đối chiếu

Mục tiêu bài học

Phân biệt CSRF với CORS, giữ bảo vệ cho request ghi và gửi token cùng cookie khi kiểm tra API.

CSRF bảo vệ request dùng thông tin xác thực tự gửi

Trình duyệt có thể tự gửi cookie đăng nhập khi gọi một website. Nếu website nhận POST thay đổi dữ liệu mà không xác minh nguồn yêu cầu phù hợp, một trang khác có thể dụ trình duyệt gửi thao tác thay người dùng. CSRF token là một phần cơ chế chống tình huống đó.

Mẫu giữ CSRF mặc định cho cả form và API vì ứng dụng có session và HTTP Basic. Tên “REST API” hoặc body JSON không tự chứng minh mọi rủi ro CSRF đã biến mất. Nếu xây API stateless dùng bearer token, cần thiết kế riêng dựa trên cách token được lưu và gửi; không disable CSRF toàn bộ ứng dụng chỉ để Postman chạy được.

Token và session đi cùng nhau

Form Thymeleaf nhận token qua input ẩn. Client API lấy token từ GET /api/csrf sau khi có xác thực teacher, giữ cookie session rồi gửi token trong header mà endpoint trả về. Endpoint trả Cache-Control: no-store để tránh cache token. Không copy token của một session sang session khác rồi mong nó còn hợp lệ.

Tệp trong mã nguồn mẫu: src/main/java/com/hocvietcode/academy/CourseApiController.java. Đoạn dưới được trích từ tệp này; xem bản tải về để có đủ import và phần còn lại.

public record Token(String headerName,String parameterName,String token){}
@GetMapping("/csrf") ResponseEntity<Token> csrf(CsrfToken token){return ResponseEntity.ok().cacheControl(CacheControl.noStore()).body(new Token(token.getHeaderName(),token.getParameterName(),token.getToken()));}
# PowerShell: ứng dụng đang chạy và biến mật khẩu demo đã được đặt
$pair = "teacher:$env:HVC_DEMO_PASSWORD"
$basic = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($pair))
$headers = @{ Authorization = "Basic $basic" }
$response = Invoke-WebRequest http://localhost:8080/api/csrf -Headers $headers -SessionVariable session
$csrf = $response.Content | ConvertFrom-Json
$headers[$csrf.headerName] = $csrf.token
$body = @{title="API demo"; price=0; categoryId=1} | ConvertTo-Json
Invoke-RestMethod http://localhost:8080/api/courses -Method Post -Headers $headers -WebSession $session -ContentType "application/json" -Body $body

CORS là chính sách trình duyệt, không phải đăng nhập

Origin gồm scheme, host và port. http://localhost:3000 khác http://localhost:8080. Nếu frontend ở origin khác, trình duyệt áp dụng CORS và có thể gửi OPTIONS preflight trước request thật. Cấu hình phải nêu origin, method và header được phép; khi dùng credentials, không thể đơn giản dùng wildcard origin cho mọi nơi.

SecurityConfig nối rõ CorsConfigurationSource vào SecurityFilterChain. Mẫu chỉ cho origin lấy từ hvc.allowed-origin, mặc định localhost:3000, và header X-CSRF-TOKEN. Khi chuyển môi trường phải thay origin đúng; không giữ danh sách localhost như cấu hình production.

Tệp trong mã nguồn mẫu: src/main/java/com/hocvietcode/academy/SecurityConfig.java. Đoạn dưới được trích từ tệp này; xem bản tải về để có đủ import và phần còn lại.

@Bean CorsConfigurationSource cors(AppSettings settings){
    CorsConfiguration c=new CorsConfiguration();c.setAllowedOrigins(List.of(settings.allowedOrigin()));
    c.setAllowedMethods(List.of("GET","POST","PUT","DELETE","OPTIONS"));c.setAllowedHeaders(List.of("Content-Type","Authorization","X-CSRF-TOKEN"));c.setAllowCredentials(true);
    UrlBasedCorsConfigurationSource source=new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/api/**",c);return source;
}

Chẩn đoán có thứ tự

Nếu OPTIONS bị từ chối hoặc thiếu Access-Control-Allow-Origin, xem cấu hình CORS. Nếu POST đã tới server nhưng bị 403, xem quyền và CSRF. Nếu dùng curl thành công nhưng trình duyệt thất bại, sự khác biệt có thể nằm ở CORS hoặc cookie; curl không áp chính sách CORS như trình duyệt.

Kiểm thử mẫu có origin được cho phép và origin lạ, đồng thời kiểm tra request ghi thiếu CSRF bị chặn. Token cần lấy lại sau thay đổi phiên như đăng nhập/đăng xuất theo luồng client. Không đưa token hay Authorization vào ảnh chụp, log công khai hoặc mã nguồn.

Lỗi thường gặp và lưu ý

  • CORS không ngăn một chương trình ngoài trình duyệt gửi request tới server.
  • Không sửa 403 bằng cách bỏ cả CSRF, CORS và phân quyền cùng lúc.

Ghi nhớ

CSRF xác minh request trong mô hình phiên; CORS điều khiển đọc response xuyên origin trên trình duyệt; cả hai không thay thế quyền truy cập.

Tài liệu đối chiếu

  • CSRF
  • CORS

← Bài 18 · Mục lục 12 chương · Bài 20 →

Bài viết liên quan:

Java và Spring Boot – MVC và REST API
Spring Boot bài 23: Gọi dịch vụ HTTP bằng RestClient và đặt timeout
Java và Spring Boot – MVC và REST API
Spring Boot bài 24: Gửi email và lập lịch tác vụ trong Spring Boot
Java và Spring Boot – MVC và REST API
Spring Boot bài 08: Fragment, layout và tài nguyên CSS trong Spring Boot
Java và Spring Boot – MVC và REST API
Spring Boot bài 25: Unit test Service với JUnit và Mockito
Java và Spring Boot – MVC và REST API
Spring Boot bài 09: Binding biểu mẫu tạo và sửa khóa học
Java và Spring Boot – MVC và REST API
Spring Boot bài 26: Integration test MVC, API, database và Security
Java và Spring Boot – MVC và REST API
Spring Boot bài 10: Validation và BindingResult: báo lỗi ngay trên biểu mẫu
Java và Spring Boot – MVC và REST API
Spring Boot bài 27: Logging, Actuator và quản lý schema bằng Flyway
Java và Spring Boot – MVC và REST API
Spring Boot bài 11: Post/Redirect/Get, flash message và session
Java và Spring Boot – MVC và REST API
Spring Boot bài 28: Đóng gói JAR, Docker và cấu hình triển khai
Java và Spring Boot – MVC và REST API
Spring Boot bài 12: JPA Entity, Repository, H2 và migration đầu tiên
Java và Spring Boot – MVC và REST API
Giáo trình Spring Boot MVC và REST API 2026: 12 chương, 28 bài

Dịch vụ thiết kế Wesbite

NỘI DUNG MỚI CẬP NHẬT

Hạ tầng mạng máy tính: router, switch, Wi-Fi và TCP/IP

Mạng máy tính bài 04: TCP, UDP, port và socket: Dữ liệu đến đúng ứng dụng thế nào?

Hạ tầng mạng máy tính: router, switch, Wi-Fi và TCP/IP

Mạng máy tính bài 03: Biểu diễn dữ liệu, mật mã hóa và phiên làm việc trên web

Hạ tầng mạng máy tính: router, switch, Wi-Fi và TCP/IP

Mạng máy tính bài 05: Địa chỉ IP, subnet và router: Máy tính tìm đường tới đích thế nào?

Hạ tầng mạng máy tính: router, switch, Wi-Fi và TCP/IP

Mạng máy tính bài 02: OSI và TCP/IP: Điều gì xảy ra khi bạn mở một website?

Hạ tầng mạng máy tính: router, switch, Wi-Fi và TCP/IP

Mạng máy tính bài 01: Mạng máy tính là gì? Từ Wi-Fi gia đình đến Internet

Giới thiệu

hocvietcode.com là website chia sẻ và cập nhật tin tức công nghệ, chia sẻ kiến thức, kỹ năng. Chúng tôi rất cảm ơn và mong muốn nhận được nhiều phản hồi để có thể phục vụ quý bạn đọc tốt hơn !

Liên hệ quảng cáo: [email protected]

Kết nối với HỌC VIẾT CODE

© hocvietcode.com - Tech888 Co .Ltd since 2019

Đăng nhập

Trở thành một phần của cộng đồng của chúng tôi!
Registration complete. Please check your email.
Đăng nhập bằng google
Đăng kýBạn quên mật khẩu?

Create an account

Welcome! Register for an account
The user name or email address is not correct.
Registration confirmation will be emailed to you.
Log in Lost your password?

Reset password

Recover your password
Password reset email has been sent.
The email could not be sent. Possible reason: your host may have disabled the mail function.
A password will be e-mailed to you.
Log in Register
×