diff --git a/core/modules/dynamic_page_cache/src/EventSubscriber/DynamicPageCacheSubscriber.php b/core/modules/dynamic_page_cache/src/EventSubscriber/DynamicPageCacheSubscriber.php
index c0c3399..6614dc6 100644
--- a/core/modules/dynamic_page_cache/src/EventSubscriber/DynamicPageCacheSubscriber.php
+++ b/core/modules/dynamic_page_cache/src/EventSubscriber/DynamicPageCacheSubscriber.php
@@ -41,14 +41,6 @@
 class DynamicPageCacheSubscriber implements EventSubscriberInterface {
 
   /**
-   * Attribute name of the Dynamic Page Cache request policy result.
-   *
-   * @see onRouteMatch()
-   * @see onRespond()
-   */
-  const ATTRIBUTE_REQUEST_POLICY_RESULT = '_dynamic_page_cache_request_policy_result';
-
-  /**
    * Name of Dynamic Page Cache's response header.
    */
   const HEADER = 'X-Drupal-Dynamic-Cache';
@@ -104,6 +96,13 @@ class DynamicPageCacheSubscriber implements EventSubscriberInterface {
   ];
 
   /**
+   * Internal cache of request policy results.
+   *
+   * @var \SplObjectStorage
+   */
+  protected $requestPolicyResult;
+
+  /**
    * Constructs a new DynamicPageCacheSubscriber object.
    *
    * @param \Drupal\Core\PageCache\RequestPolicyInterface $request_policy
@@ -120,6 +119,7 @@ public function __construct(RequestPolicyInterface $request_policy, ResponsePoli
     $this->responsePolicy = $response_policy;
     $this->renderCache = $render_cache;
     $this->rendererConfig = $renderer_config;
+    $this->requestPolicyResults = new \SplObjectStorage();
   }
 
   /**
@@ -134,7 +134,7 @@ public function onRouteMatch(GetResponseEvent $event) {
     // does not have to redo the request policy check.
     $request = $event->getRequest();
     $request_policy_result = $this->requestPolicy->check($request);
-    $request->attributes->set(self::ATTRIBUTE_REQUEST_POLICY_RESULT, $request_policy_result);
+    $this->requestPolicyResults[$request] = $request_policy_result;
     if ($request_policy_result === RequestPolicyInterface::DENY) {
       return;
     }
@@ -188,14 +188,14 @@ public function onResponse(FilterResponseEvent $event) {
     // @see \Drupal\Core\Routing\AccessAwareRouter::checkAccess()
     // @see \Drupal\Core\EventSubscriber\DefaultExceptionHtmlSubscriber::on403()
     $request = $event->getRequest();
-    if (!$request->attributes->has(self::ATTRIBUTE_REQUEST_POLICY_RESULT)) {
+    if (!isset($this->requestPolicyResults[$request])) {
       return;
     }
 
     // Don't cache the response if the Dynamic Page Cache request & response
     // policies are not met.
     // @see onRouteMatch()
-    if ($request->attributes->get(self::ATTRIBUTE_REQUEST_POLICY_RESULT) === RequestPolicyInterface::DENY || $this->responsePolicy->check($response, $request) === ResponsePolicyInterface::DENY) {
+    if ($this->requestPolicyResults[$request] === RequestPolicyInterface::DENY || $this->responsePolicy->check($response, $request) === ResponsePolicyInterface::DENY) {
       return;
     }
 
