You want both sizes - the "thumbnail" size and the "display size" - as separate images.
You
never want to depend on the browser resizing the images--especially if they're large (file size), unless you know that the user guaranteed to open the larger version--as that would dramatically effect your loading speed/bandwidth, dependent on the quality of the original.
Generally speaking, it's a good idea to have the pictures pre-sized on the server, eg, a directory \images, \thumbnails, \original or something along those lines, and use them accordingly. Another option, which would use some CPU power every time, would be to have just the original and have a server-side script manipulate/resize the image...saving you some HDD space, but unless that's needed, I'd stick with the pre-sized ones.
Caching the images does indeed work, presuming the user's cache size is large enough (usually not a problem), but it'll be forking over the full image each time, regardless if the user just opens the page and decides to only open one of the pictures. And in doing that, they'll be waiting for the full image to load, even though the image is smaller on the screen.
Also, quality can be bad when the browser resizes the image--but that's usually not a big issue since it's a thumbnail and they're minor annoyances..
Now, if you know they're going to open every picture, you could do it the browser-controlled way, just prepare for the page to take a few minutes to load (which the general public would frown upon :happy

.