客户端状态管理
Edge Network本身是无状态的(它不维护自己的会话)。 但是,有一些用例需要客户端状态持久性,例如:
- 一致的设备标识
- 收集并强制执行用户同意
- 保留个性化会话ID
Edge Network使用状态管理协议,将存储方面的委派给其客户端/SDK,并在其响应中包含状态条目。 对于浏览器,条目将存储为Cookie。
客户端负责存储这些请求并将其包含在所有后续请求中。 客户端还必须按照网关的指示,确保条目正确过期。 当条目存储为Cookie时,浏览器会自动完成所有这些工作。
尽管状态条目始终具有纯String值(对调用方/SDK可见),但您不应以任何方式使用或篡改这些值。 值结构/格式甚至名称本身都可能随时更改,这可能会导致在内部使用状态的客户端出现意外行为。 状态旨在始终由网关本身或其他边缘服务使用。
将客户端状态作为元数据保留
响应正文中的Edge Network返回的状态是类型为Handle的state:store对象。
{
"requestId":"421036b3-a7ff-480b-a9ab-30adba6eb4f0",
"handle":[
{
"payload":[
{
"key":"kndctr_53A16ACB5CC1D3760A495C99_AdobeOrg_consent_check",
"value":"1",
"maxAge":7200,
"attrs":{
"SameSite":"None"
}
},
{
"key":"kndctr_53A16ACB5CC1D3760A495C99_AdobeOrg_identity",
"value":"CiY1NDc1ODIxNzIzODk5MDY5MzQzMTIzNjQ1NTczNzExNjE4OTA1MFINCLGOvszNLhABGAEgBKABsY6-zM0uqAGHz-z2y82cul3wAbGOvszNLg==",
"maxAge":34128000,
"attrs":{
"SameSite":"None"
}
},
{
"key":"kndctr_53A16ACB5CC1D3760A495C99_AdobeOrg_consent",
"value":"general=in",
"maxAge":15552000,
"attrs":{
"SameSite":"None"
}
}
],
"type":"state:store"
}
]
}
keyvaluemaxAgeattrsMap<String, String>SameSite属性均设置为None。为了支持多标记(即,同一属性中包含多个SDK实例,这些实例可能引用不同的组织),所有状态条目都会自动添加前缀kndctr_以及URL安全的组织ID。
当客户端SDK在响应中收到state:store句柄时,必须执行以下操作:
- 存储客户端条目,遵守网关提供的过期时间。
- 从客户端存储加载它们,并在后续请求中包含所有未过期的条目。
以下是以客户端存储状态传递的请求的示例:
{
"meta":{
"state":{
"entries":[
{
"key":"kndctr_53A16ACB5CC1D3760A495C99_AdobeOrg_consent_check",
"value":"1"
},
{
"key":"kndctr_53A16ACB5CC1D3760A495C99_AdobeOrg_personalization_sessionId",
"value":"0a88f43e-044b-41a6-a4f3-6c2848bbc672"
}
]
}
}
}
在浏览器Cookie中保留客户端状态
使用浏览器客户端时,Edge Network可以自动将条目作为浏览器Cookie保留。 这允许透明状态存储支持,因为默认情况下浏览器遵循状态管理协议。
几乎所有条目在启用和受支持时都会被具体化为第一方Cookie(请参阅下面的注释),但在使用第三方adobedc.demdex.net域时,网关还可以存储一些第三方Cookie。
由于条目根据其定义始终绑定到特定范围(设备/应用程序),因此Edge Network只会写入与当前请求上下文兼容的子集。 未写入的条目为
在state:store句柄中返回。
通常,应用程序范围的条目始终作为第一方Cookie写入,而设备范围的条目作为第三方Cookie写入。 该决定对于呼叫者是完全透明的,网关根据呼叫上下文决定可以写入哪些条目。
调用方必须通过meta.state.cookiesEnabled标志明确启用将客户端状态存储为Cookie的支持:
{
"meta":{
"state":{
"cookiesEnabled":true,
"domain":"foo.com"
}
}
}
cookiesEnabledfalse。domaincookiesEnabled: true时必需。 应在其上写入Cookie的顶级域。 Edge Network将使用此值来确定状态能否作为Cookie保留。即使通过cookiesEnabled标志启用了Cookie支持,Adobe Experience Platform Edge Network也只会在请求顶级域与调用方指定的domain匹配时写入状态条目。 当存在不匹配时,会在state:store句柄中返回条目。
在以下情况下,无法写入第一方Cookie(即使启用了支持):
- 请求来自第三方
adobedc.demdex.net域。 - 请求来自第一方
CNAME域,不同于调用方在meta.state.domain中指定的域。
Cookie安全性
所有Cookie都尽可能启用安全标志。
所有安全Cookie的SameSite属性均设置为None,这意味着Cookie会在第一方和跨域的所有上下文中发送。
- 对于第一方Cookie (
kndcrt_*),仅当请求上下文安全(HTTPS)并且反向链接(SecureReferer HTTP标头)也是HTTPS时,才会设置标志。 如果反向链接不安全(HTTP),则忽略Secure标志以允许Web SDK读取它们。 无法从不安全的上下文中读取安全Cookie。 - 对于第三方Cookie (demdex),始终设置
Secure标志,因为所有请求都是HTTPS,因此请求上下文是安全的,并且从不从JavaScript读取此Cookie。
Secure标记在Cookie的元数据表示中不存在。 仅包括SameSite特性。 在这种情况下,只要存在Secure属性,客户端就有责任正确设置SameSite标志。 具有SameSite=None的Cookie还必须指定Secure属性,因为它们需要安全上下文(HTTPS)。