Part 03 · Spring Framework & Spring Boot · 3.1.08

Spring Security filter architecture

Security của servlet application bắt đầu trước controller: request được chọn vào một security filter chain, xác thực principal, lưu context và kiểm tra authorization ở nhiều boundary.


DelegatingFilterProxy và FilterChainProxy

Servlet container gọi DelegatingFilterProxy, bridge tới Spring bean FilterChainProxy. FilterChainProxy chọn SecurityFilterChain đầu tiên có matcher phù hợp rồi chạy security filters theo order. Khi có nhiều chains cho API và UI, matcher/order phải không chồng lấn ngoài ý muốn.

Authentication flow

  1. Authentication filter lấy credential và tạo unauthenticated Authentication request.
  2. AuthenticationManager, thường là ProviderManager, thử các AuthenticationProvider.
  3. Provider xác minh credential và trả authenticated principal hoặc ném failure.
  4. Thành công được lưu vào SecurityContext; thất bại đi qua entry point hoặc failure handler.

Password phải dùng adaptive one-way encoder như bcrypt, PBKDF2, scrypt hoặc Argon2 với work factor phù hợp. Upgrade encoding khi user đăng nhập thành công thay vì giữ hash yếu mãi.

SecurityContext và thread boundary

SecurityContextHolder strategy thường gắn context với thread; filter load/save context qua repository theo session hoặc stateless policy. Async task và thread pool cần context propagation có chủ đích và cleanup sau execution để tránh mất hoặc leak principal giữa requests.

Authorization nhiều lớp

BoundaryVai tròKhông thay thế
Request authorizationCho phép URL/method theo principal và authority.Object ownership hoặc tenant isolation.
Method securityBảo vệ service method qua proxy.Query/data filtering đúng tenant.
Domain/application checksKiểm invariant, ownership và state transition.Authentication và protocol controls.

Thiết kế deny-by-default; scope/role chỉ là input. Object-level authorization phải được kiểm ở use case hoặc query để ngăn IDOR và cross-tenant access.

CSRF, CORS và session

CSRF được bật mặc định cho browser session vì cookie được tự động gửi. Stateless bearer API có threat model khác, nhưng không tắt CSRF máy móc nếu vẫn dùng cookie. CORS cần được xử lý trước security vì preflight thường không mang credential. Với login session, cân nhắc session-fixation protection, timeout và concurrent-session policy.

CORS không phải authorization: nó là browser policy. Server vẫn phải xác thực và kiểm quyền mọi request, kể cả client không tuân CORS.

OAuth2 Resource Server

JWT decoder phải validate signature, issuer và timestamps; audience thường cần validator bổ sung theo API. Mapping scopes/claims thành authorities không thay domain authorization. Opaque-token introspection thêm network dependency nên cần timeout, failure policy và cache có thời hạn phù hợp.

Security headers và error contract

Security headers là defense-in-depth. AuthenticationEntryPoint tạo 401 khi chưa authenticated; AccessDeniedHandler tạo 403 khi principal không đủ quyền. JSON API không nên redirect sang HTML login. Log security decision phải redact credentials và tuyệt đối không ghi raw access token.

Debugging flow: xác định chain nào match → filter nào tạo/không tạo Authentication → context có được lưu/khôi phục → authorization manager nhận authorities nào → object-level check và query tenant có đúng không.
Nguồn tham khảo