A forged request can't guess the HMAC key, and a forged request with an invalid key is refused. A replay is disallowed after the timeout. The server can also keep track of "spent" tickets until they would have timed out, preventing a replay even during the timeout period.
Basically it’s done like this:
1. The server passes a random string to the client
2. The client performs a calculation on the password and the random string
3. The client passes the username (in plain text) and the result of the calculation to the server
4. The server performs the same calculation as the client did and compares the output to the output of the client.
5. If it’s a match, the client is authentic.
In the case of tickets, the one signing is "this server then" and the one checking is "this server now", with a period of amnesia (about the data, not about the password) in between.
Seriously, if you want security, use SSL.
SSL, on the other hand does nothing to prevent a cross-site attack. Anything that can run code in the client browser can in principle cause it to send a fraudulent shopping cart "securely" to the server.
Problem 1: protection from session hijack across a series of requests. Solution: tickets.
Problem 2: protection from interception and alteration of the commands within one request. Solution: SSL.
SSL (even in its most powerful form as a password-protected client-side CA-signed cert!) provides no protection against problem 1.
The classic (and best) method for foiling these attacks is to store a special/randomized token in a server-side session, and require that token to be submitted from the client via a standard form, essentially making forged attacks impossible. Take away the ability to store these tokens in some sort of server-side session, and you open your site to attack?