Guards quyết định request có được phép đi tiếp không (authorization). Khác với Middleware, Guards implement interface CanActivate và có access vào ExecutionContext — biết được handler nào sẽ được gọi, rất hữu ích cho role-based access control.
JWT Auth Guard hoạt động: extract Bearer token từ header Authorization, verify token bằng JwtService.verify(), nếu hợp lệ attach payload vào request.user và trả về true, ngược lại throw UnauthorizedException. Guards có thể áp dụng với @UseGuards() ở mức route, controller, hoặc global qua APP_GUARD provider.
Public decorator pattern: dùng SetMetadata('isPublic', true) với @Public() decorator, trong guard đọc metadata qua Reflector để bỏ qua authentication cho các route công khai.