diff --git a/docs/_newsfragments/1574-add-link-crossorigin.feature.rst b/docs/_newsfragments/1574-add-link-crossorigin.feature.rst
new file mode 100644
index 0000000..f5ea187
--- /dev/null
+++ b/docs/_newsfragments/1574-add-link-crossorigin.feature.rst
@@ -0,0 +1,2 @@
+The :meth:`~.Response.add_link` method now supports setting the `crossorigin`
+link CORS settings attribute.
diff --git a/falcon/response.py b/falcon/response.py
index 3042a5d..4d7e0ae 100644
--- a/falcon/response.py
+++ b/falcon/response.py
@@ -40,6 +40,8 @@ _STREAM_LEN_REMOVED_MSG = (
 )
 
 
+_RESERVED_CROSSORIGIN_VALUES = frozenset({'anonymous', 'use-credentials'})
+
 _RESERVED_SAMESITE_VALUES = frozenset({'lax', 'strict', 'none'})
 
 
@@ -668,7 +670,7 @@ class Response:
             _headers[name] = value
 
     def add_link(self, target, rel, title=None, title_star=None,
-                 anchor=None, hreflang=None, type_hint=None):
+                 anchor=None, hreflang=None, type_hint=None, crossorigin=None):
         """Add a link header to the response.
 
         (See also: RFC 5988, Section 1)
@@ -725,6 +727,9 @@ class Response:
                 result of dereferencing the link (default ``None``). As noted
                 in RFC 5988, this is only a hint and does not override the
                 Content-Type header returned when the link is followed.
+            crossorigin(str):  Determines how cross origin requests are handled.
+                Can take values 'anonymous' or 'use-credentials' or None.
+                (See: https://www.w3.org/TR/html50/infrastructure.html#cors-settings-attribute)
 
         """
 
@@ -771,6 +776,19 @@ class Response:
         if anchor is not None:
             value += '; anchor="' + uri_encode(anchor) + '"'
 
+        if crossorigin is not None:
+            crossorigin = crossorigin.lower()
+            if crossorigin not in _RESERVED_CROSSORIGIN_VALUES:
+                raise ValueError(
+                    'crossorigin must be set to either '
+                    "'anonymous' or 'use-credentials'")
+            if crossorigin == 'anonymous':
+                value += '; crossorigin'
+            else:  # crossorigin == 'use-credentials'
+                # PERF(vytas): the only remaining value is inlined.
+                # Un-inline in case more values are supported in the future.
+                value += '; crossorigin="use-credentials"'
+
         _headers = self._headers
         if 'link' in _headers:
             _headers['link'] += ', ' + value

diff --git a/tests/test_headers.py b/tests/test_headers.py
index 1c29514..3d85eef 100644
--- a/tests/test_headers.py
+++ b/tests/test_headers.py
@@ -701,6 +701,41 @@ class TestHeaders:
 
         self._check_link_header(client, resource, expected_value)
 
+    @pytest.mark.parametrize('crossorigin,expected_value', [
+        (None, '</related/thing>; rel=alternate'),
+        ('anonymous', '</related/thing>; rel=alternate; crossorigin'),
+        ('Anonymous', '</related/thing>; rel=alternate; crossorigin'),
+        ('AnOnYmOUs', '</related/thing>; rel=alternate; crossorigin'),
+        (
+            'Use-Credentials',
+            '</related/thing>; rel=alternate; crossorigin="use-credentials"',
+        ),
+        (
+            'use-credentials',
+            '</related/thing>; rel=alternate; crossorigin="use-credentials"',
+        ),
+    ])
+    def test_add_link_crossorigin(self, client, crossorigin, expected_value):
+        resource = LinkHeaderResource()
+        resource.add_link('/related/thing', 'alternate',
+                          crossorigin=crossorigin)
+
+        self._check_link_header(client, resource, expected_value)
+
+    @pytest.mark.parametrize('crossorigin', [
+        '*',
+        'Allow-all',
+        'Lax',
+        'MUST-REVALIDATE',
+        'Strict',
+        'deny',
+    ])
+    def test_add_link_invalid_crossorigin_value(self, crossorigin):
+        resp = falcon.Response()
+
+        with pytest.raises(ValueError):
+            resp.add_link('/related/resource', 'next', crossorigin=crossorigin)
+
     def test_content_length_options(self, client):
         result = client.simulate_options()
 

Update Response:add_link() to support setting the crossorigin attribute
tests/test_headers.py::TestHeaders::test_add_link_crossorigin[None-</related/thing>; tests/test_headers.py::TestHeaders::test_add_link_crossorigin[anonymous-</related/thing>; tests/test_headers.py::TestHeaders::test_add_link_crossorigin[Anonymous-</related/thing>; tests/test_headers.py::TestHeaders::test_add_link_crossorigin[AnOnYmOUs-</related/thing>; tests/test_headers.py::TestHeaders::test_add_link_crossorigin[Use-Credentials-</related/thing>; tests/test_headers.py::TestHeaders::test_add_link_crossorigin[use-credentials-</related/thing>; tests/test_headers.py::TestHeaders::test_add_link_invalid_crossorigin_value[*] tests/test_headers.py::TestHeaders::test_add_link_invalid_crossorigin_value[Allow-all] tests/test_headers.py::TestHeaders::test_add_link_invalid_crossorigin_value[Lax] tests/test_headers.py::TestHeaders::test_add_link_invalid_crossorigin_value[MUST-REVALIDATE] tests/test_headers.py::TestHeaders::test_add_link_invalid_crossorigin_value[Strict] tests/test_headers.py::TestHeaders::test_add_link_invalid_crossorigin_value[deny]
tests/test_headers.py::TestHeaders::test_content_length tests/test_headers.py::TestHeaders::test_declared_content_length_on_head tests/test_headers.py::TestHeaders::test_declared_content_length_overridden_by_no_body tests/test_headers.py::TestHeaders::test_declared_content_length_overriden_by_body_length tests/test_headers.py::TestHeaders::test_declared_content_length_overriden_by_data_length tests/test_headers.py::TestHeaders::test_expires_header tests/test_headers.py::TestHeaders::test_default_value tests/test_headers.py::TestHeaders::test_unset_header[True] tests/test_headers.py::TestHeaders::test_unset_header[False] tests/test_headers.py::TestHeaders::test_required_header tests/test_headers.py::TestHeaders::test_no_content_length[204 tests/test_headers.py::TestHeaders::test_no_content_length[304 tests/test_headers.py::TestHeaders::test_content_header_missing tests/test_headers.py::TestHeaders::test_passthrough_request_headers tests/test_headers.py::TestHeaders::test_headers_as_list tests/test_headers.py::TestHeaders::test_default_media_type tests/test_headers.py::TestHeaders::test_override_default_media_type[text/plain; tests/test_headers.py::TestHeaders::test_override_default_media_type[text/plain-Hello tests/test_headers.py::TestHeaders::test_override_default_media_type_missing_encoding tests/test_headers.py::TestHeaders::test_response_header_helpers_on_get tests/test_headers.py::TestHeaders::test_unicode_location_headers tests/test_headers.py::TestHeaders::test_unicode_headers_convertable tests/test_headers.py::TestHeaders::test_response_set_and_get_header tests/test_headers.py::TestHeaders::test_response_append_header tests/test_headers.py::TestHeaders::test_set_cookie_disallowed[ValueError-Set-Cookie] tests/test_headers.py::TestHeaders::test_set_cookie_disallowed[ValueError-set-cookie] tests/test_headers.py::TestHeaders::test_set_cookie_disallowed[ValueError-seT-cookie] tests/test_headers.py::TestHeaders::test_set_cookie_disallowed[HeaderNotSupported-Set-Cookie] tests/test_headers.py::TestHeaders::test_set_cookie_disallowed[HeaderNotSupported-set-cookie] tests/test_headers.py::TestHeaders::test_set_cookie_disallowed[HeaderNotSupported-seT-cookie] tests/test_headers.py::TestHeaders::test_vary_star tests/test_headers.py::TestHeaders::test_vary_header[vary0-accept-encoding] tests/test_headers.py::TestHeaders::test_vary_header[vary1-accept-encoding, tests/test_headers.py::TestHeaders::test_content_type_no_body tests/test_headers.py::TestHeaders::test_no_content_type[204 tests/test_headers.py::TestHeaders::test_no_content_type[304 tests/test_headers.py::TestHeaders::test_custom_content_type tests/test_headers.py::TestHeaders::test_add_link_single tests/test_headers.py::TestHeaders::test_add_link_multiple tests/test_headers.py::TestHeaders::test_add_link_with_title tests/test_headers.py::TestHeaders::test_add_link_with_title_star tests/test_headers.py::TestHeaders::test_add_link_with_anchor tests/test_headers.py::TestHeaders::test_add_link_with_hreflang tests/test_headers.py::TestHeaders::test_add_link_with_hreflang_multi tests/test_headers.py::TestHeaders::test_add_link_with_type_hint tests/test_headers.py::TestHeaders::test_add_link_complex tests/test_headers.py::TestHeaders::test_content_length_options tests/test_headers.py::TestHeaders::test_disabled_cors_should_not_add_any_extra_headers tests/test_headers.py::TestHeaders::test_enabled_cors_should_add_extra_headers_on_response tests/test_headers.py::TestHeaders::test_enabled_cors_should_accept_all_origins_requests tests/test_headers.py::TestHeaders::test_enabled_cors_handles_preflighting tests/test_headers.py::TestHeaders::test_enabled_cors_handles_preflighting_no_headers_in_req