Heroku devcenter has an excellent article on this subject.
Quoting from it,
While the Cache-Control header turns on client-side caching and sets the max-age of a resource, the Expires header is used to specify a specific point in time the resource is no longer valid.