The HTTP protocol, by its very nature, is a stateless protocol. HTTP follows a simple request/response paradigm. The client (that is the browser or any other application /applet, which uses HTTP for communication with a server) opens a TCP/IP connection to the server, sends a request, and receives the response from the server. Different requests from the same client to the same server - be it on the same TCP/IP connection or on another one - do not bear any relationship to each other.
Web applications, on the other hand, are becoming more and more complex and need to embed single requests within a larger entity, for example, a complete HTML page, a user session which has been initiated on the Web server, a shopping cart, a registered customer, etc.
To do so, there must be some means to transfer state information from the server to the client, which in turn is returned back to the server within subsequent HTTP requests so that the server can associate the request with the user session (shopping cart, customer, etc.) and respond properly.
By their very nature, any Web browser properly handles the techniquesused by Web applications to transfer state information.
A load testing project that should deliver useful results must simulate real users using real browsers for accessing a Web server. Otherwise the results would be inaccurate at best, or mere meaningless. To accomplish this, a load testing tool must be able to cope with all techniques used for maintaining state information, just like any browser does.