Hi Justin, 

Purely practical cookie issues: 

1) Browsers that follow the original Netscape cookie definition limit a single 
cookie to 4096 bytes, with a maximum of 20 cookies per site. Due to encoding 
issues and overhead your actual storage limit will vary by a few bytes. IE 
recently increased 20 to a maximum of 50. 

2) Browsers often have cookies limited in other ways (not accepted at all, not 
accepted beyond the browser session or across hosts even though you say so, not 
accepted unless they match certain known names, etc.) 

3) Cookies are per browser. They don't identify multiple browser entries into 
your application. 

4) The browser sends EVERY COOKIE back to the matching paths on the server in 
the header of EVERY REQUEST. If you poke a whopping 200K of not-path-restricted 
cookies at a client, now that client will send 200K of data upstream every time 
it ... i donno ... fetches an image or a CSS stylesheet or something from your 
server. So the Netscape-designed 60K limitation was sensible (and Microsoft 
shows the usual consideration by changing the limit to 200K for the world's 
most common browser). If the trend continues, any predictions on how soon 
hosting providers drop their "upload bandwidth is free" policies? 

If the entire amount of state you want to persist is guaranteed to fit in less 
than 4K (or you can rely on some kind of splitting approach to set multiple 
cookies for more storage), and you can be sure your clients will accept your 
cookies and respect the limits you set, and you really want per-browser 
sessionality, this is probably all the mechanism you need. 


Theoretical cookie issues (with idiomatic Session use, not the 
XML-cookie-storage you described): 

The limits on cookies were one impetus driving server platform vendors to 
establish a server-side bag of Sessionality, sending a small cookie to create 
affinity with it, and eventually for the application server community to 
canonize this as the default idiom. Maybe this happened because the first round 
of commercial Web application servers had various session management features 
as a big selling point, and everyone with time to write documentation and 
examples wanted to make sure everybody used the heck out of 'em. 

But when you elect to keep state on the server, the server needs storage for it 
(which may not scale in the large), and the server must be responsible for 
managing it (which means it has to persist across restarts, must be available 
from all cluster nodes, etc). 

And when you elect to use a cookie as the key to a server-side bag of state, 
you must accept that the scope of that state is per browser instance and 
nothing else. 

These are valid choices, but I think they are choices that developers should 
actually make , and there are lots of alternatives. Take away the Servlet 
Session, and how many of the extant servlet-based applications in the world 
would be mortally wounded and need significant porting? 80%? 90%? I'm not a 
rabid RESTian by any means, but I can't make myself believe that a server-side 
hash full of state with a cookie-based key was the right choice for all of 
them. 

Restlet *does* take away the Servlet Session, and thereby makes a developer 
think what they're going to do without it. 


This thinking process, I feel, takes two forks: 

1) Calling a resource a resource 

Typically the stuff that one might put in the Servlet Session (e.g. the 
contents of a shopping cart or the result of a database query) is really a 
server-side resource. I advocate giving some thought to where it should live 
(on disk? in memory? as a symbol that's reified only upon access?), instead of 
being seduced by a default which does not fit all cases. This is where I think 
Marc was going -- for Restlet to provide some handy options for this. And after 
reading some other people's code today, I fear that maybe the seductive default 
in Restlet is to stow everything in a file, and that's not really good either. 
So maybe an expanded library of Client connectors and some semantics for 
defining and expiring transient resources is the brave way forward that Marc 
called for. If you're still reading, Marc, what would you think of something 
like a new Client(Protocol.TEMP) that let you name and operate on resources 
that are meant to be transient? 

2) Whatever does not actually need to be a server side resource, try hard to 
give to the client. It won't hurt and it's what users expect. 

Users want their Back and Forward buttons to work. They want to be able to 
visit a 4-day old page in their browser history and pick up from where they 
left off. They want to slap their laptop shut at LAX in the middle of an 
application session, land 13 hours later in Sydney, snap it open and continue 
without interruption. They want to open three simultaneous Firefox windows to 
your application and do different things in each one. They expect these things 
because that's how Web sites (not necessarily Web applications) work, and 
therefore that's how they expect everything on the Web to work. 

Adherence to the client-side state rule makes a lot of this ... just work. The 
representation you send -- the page itself -- the form or whatever -- is 
supposed to contain "all the information necessary to understand the 
request[s]" that might originate from that representation. That doesn't 
actually preclude the keeping of server side application information (as Yuri 
just affirmed). If you are on Step 3 of a five-step e-commerce checkout 
process, your Step 3 page could actually contain all the carried over data from 
Step 1 and Step 2 (e.g. hidden fields), or it could contain some kind of 
identifier pointing to a server-side resource that held previously entered data 
(/app/v1/orderforms/{id}), or your browser could send a cookie that contained 
that identifier (if you want multiple browser windows to always point to the 
same resource). In any of these ways, the server has sufficient information to 
understand the request and act on it. 

/rant 

:-) 

- R 


----- Original Message ----- 
From: "Stanczak Group" <[EMAIL PROTECTED]> 
To: [email protected] 
Sent: Wednesday, September 5, 2007 7:07:25 PM (GMT-0500) America/New_York 
Subject: Re: sessions debate (was Re: some benchmarking) 

Really I had planned on creating an interface that uses something like 
XStream with Cookies. 

Stanczak Group wrote: 
> So why do cookies not fill this session gap? Is that to much client 
> side dependence? 

Reply via email to