On Jun 13, 2008, at 10:45 PM, Jonas Sicking wrote:
Maciej Stachowiak wrote:
On Jun 13, 2008, at 5:20 PM, Jonas Sicking wrote:
Maciej Stachowiak wrote:
On Jun 13, 2008, at 4:56 PM, Jonas Sicking wrote:
Hi All,
Since I haven't received any feedback on the various straw-men
in the "Opting in to cookies" thread, I'll send a full proposal
(wrote most of this yesterday, Thomas wrote some opinions on
cookies this morning).
First off, as before, when I talk about "cookies" in this mail I
really
mean cookies + digest auth headers + any other headers that
carry the
users credentials to a site. However i'll just use the term
"cookies"
for readability, and since that is on the web currently the most
common carrier of credentials.
So here goes:
When loading a resource using access-control associate the
request with
a "with credentials" flag.
When the resource is loaded using an URI which starts with the
string
"user-private:" set the "with credentials" flag to true.
Otherwise set
it to false.
How could an http or https URI start with the string "user-
private:"? Are you proposing a new URI scheme?
My proposal is for nesting schemes, so you'd load
user-private:http://example.com/address.php
That strikes me as distasteful. I would prefer to see a separate
includeCrossSiteCredentials parameter on XHR somewhere than to use
in-band signalling via the URL, if we feel this is needed.
The advantage with putting it as part of the URI is that it is
agnostic
to which method used for loading. So for example inside XSLT you
could do:
<xsl:for-each
select="document('user-private:http://example.com/adr')/adr/*">
Name <xsl:value-of select="@name">
</xsl:for-each>
to incorporate private data. This is one of the design goals of
Access-Control, that it is a generic loading mechanism, rather than
limited to a particular API.
The downsides of inventing a URI scheme include:
1) URIs using this scheme will not parse into components properly (the
feed: scheme has this problem)
2) The scheme really should be registered through IANA, which will be
a bureaucratic hassle
3) IANA would probably be hesitant, because user-private: does not
describe a new resource access method, it just describes what headers
you want to send, which in http is separate from the URI
4) It is in fact a valid point that this violates the design of URI
schemes
5) Code throughout the system will have to know to special-case this
URI scheme to treat it as equivalent to the corresponding HTTP URI
Compared to that, I think the benefit of retrieving user-specific XSL
stylesheets with credentials seems pretty low.
In general, even though Access-Control originated as a generic
mechanism, the XHR use case is clearly far more important to the Web
than any other and we shouldn't stuff out-of-band parameters in the
URI just for the sake of the other relatively minor use cases.
However, I am not sure I understand the purpose of extra client-
side opt-in to cookies. Presumably the client side is cross-site
and therefore not under control of the server. So if the server is
careless about cross-site requests that include cookies or other
credentials, then I do not see how an opt-in mechanism on the
client side helps at all.
The opt-in ultimately comes from the server through the
Access-Control-With-Credentials header. However for GET requests we
don't know if the server is going to opt in or not at the time when
the request is made. Therefore the client must opt in first, however
if the client opts in but the server doesn't, the response from the
server is discarded.
So it's just to save a round trip for the cookies case for GET
requests? (A round trip the first time only since the method check
result may be cached?)
If you assume opting into cookies is common on the server side, then
the XHR implementation could send GETs with cookies but deny data and
retry the request unless the server gives an "I opted into cookies"
header in the response. If you assume the opposite is more likely then
you can send the GET without credentials first and retry if the server
responds that it would have wanted cookies (and you can cache this).
For the common case of XHR, we could also add a separate boolean
attribute specifying whether the client thinks the server wants
cookies, to suggest which of the above two guesses to take.
That would work for all cases, with extra requests pretty rare, and
would not require inventing a URI scheme.
I must say though, this is starting to sound complex and I am not
totally convinced of the need to make servers opt in to getting
cookies. Is it really a likely mistake that someone would take
affirmative steps to enable cross-site access to a per-user resource,
but then neglect to check whether requests are cross-site and act
appropriately? And if the administrator of such a server thoughtlessly
enabled cross-site access without thinking about the consequences,
would they not be equally likely to enable cross-site cookies without
thinking about the consequences?
It seems like we are adding a lot of complexity (and therefore more
opportunity for implementation mistakes) for a marginal reduction in
the likelihood of server configuration errors.
Regards,
Maciej