- From: Jonas Sicking <jonas@sicking.cc>
- Date: Thu, 18 Oct 2007 16:44:37 -0700
- To: "WAF WG (public)" <public-appformats@w3.org>
Starting a new thread in order to summarize and narrow the topic a little.
So from what I understand there are at this point several proposals for
how to authorize non-GET requests:
1) Perform a GET request to the same URI, use Content-Access headers in
combination and A with Allow header to authorize the non-GET request.
Pros:
* GET requests are common, understood and supported both server and
client side everywhere.
Cons:
* The GET request should be removed from caches by the following
non-GET request, thus requiring a special header in order to avoid
reauthorizing for every request.
* Non standard way of checking for allowed methods over HTTP
2) Perform a OPTIONS request to the same URI, use Content-Access headers
in combination with Allow header to authorize the non-GET request.
Pros:
* Standard way of checking for allowed methods over HTTP.
Cons:
* OPTIONS requests aren't allowed to be cached, thus requiring a
special header in order to avoid reauthorizing for every request.
* OPTIONS in combination with Allow currently has a different
meaning, not related to cross-site authorization, but rather
general server features.
* Apache sends by default an Allow header authorizing POST requests
to CGIs which is believed to be unsafe in general. This might be
mitigated enough by the fact that we also require Access-Control
headers to be present.
* Returning content from OPTIONS requests seems non-trivial with
apache.
3) Perform a OPTIONS request to the same URI, use Content-Access headers
in combination with a new Method-Allow header to authorize the non-GET
request.
Cons:
* OPTIONS requests aren't allowed to be cached, thus requiring a
special header in order to avoid reauthorizing for every request.
* Non standard way of checking for allowed methods over HTTP
4) Perform a GET request to a 'magic' different URI, use the contents of
the returned file to somehow describe which URIs are accessible in what
ways.
Pros:
* GET requests are common, understood and supported both server and
client side everywhere.
* The contents of the GET request will be cached in the UAs normal
network cache, thus not requiring a need for separate caching.
Cons:
* We need a more complex format of describing access as the
resource at the magic URI need to describe access to multiple
URIs.
* If we want to support micro-sites, the magic URI needs to reside
in the same directory as the original resource, thus polluting
more of the URI space.
If we don't support micro-sites, non-GET requests will require
server-wide cooperation.
5) Perform a OPTIONS request to a 'magic' different URI, use the
returned file-content and/or headers to somehow describe which URIs are
accessible in what ways.
Cons:
* OPTIONS requests aren't allowed to be cached, thus requiring a
special header in order to avoid reauthorizing for every request.
* OPTIONS requests specifying a URI is supposed to describe
interaction with the specified URI, making this a non-standard
use of OPTIONS.
* We need a more complex format of describing access as the
resource at the magic URI need to describe access to multiple
URIs.
* If we want to support micro-sites, the magic URI needs to reside
in the same directory as the original resource, thus polluting
more of the URI space.
If we don't support micro-sites, non-GET requests will require
server-wide cooperation.
* Returning file-content from OPTIONS seems non-trivial in apache.
If we rely on headers we'll end up with an even more complicated
format due to having to describe ACL for multiple URIs in just
headers.
Has there been any other suggestions? Have I missed any Pros/Cons? Feel
free to add to the above list.
Personally I think 1 or possibly 2 looks best.
Regarding 2; OPTIONS feels somewhat more going with the spirit of HTTP,
but beyond that I'm not sure what it buys us? And I dislike following
standards for the sake of following standards. Standards aren't a goal
in and of itself but rather there to make things work better.
I'm also not fully convinced that OPTIONS really is that much more in
the spirit of HTTP as that's designed for checking for server
capabilities, not for checking authorization which is really what we're
doing here.
3 doesn't seem like a win over 1 in any way as it's just as it's as
non-standard as anything else.
4 vs 1 is "cost of magic URIs" vs "cost of specialized caching".
Personally I think the complexity of describing access control for
multiple URIs will be as high as the complexity of a cache.
5 feels really messy as the we'll both have to have a specialized cache,
deal with the complexity of describing multiple URIs, possibly squeezed
into a single header, and deal with cost of magic URIs.
/ Jonas
Received on Thursday, 18 October 2007 23:46:34 UTC