This is really kinda a bonkers way to do it, but may fit your solution.
Keep in mind this requires 2 Cloudpages and a data extension.
First, you will want to build out a data extension with a 1 hour (or your preferred setting) individual row data retention policy. Inside this DE, you will want to have the following fields:
SubscriberKey | JobID | CreatedDate | GUID
I would then set SubscriberKey, JobID and CreatedDate as the PrimaryKeys
From there you would build the first CloudPage.
This cloudpage will be all AMPscript and essentially it will create a GUID and then do an upsert to the DE we created above attaching the GUID to the Subscriber.
Something like:
%%[
set @GUID = GUID()
set @SubscriberKey = AttributeValue("_SubscriberKey")
set @JobID = AttributeValue("jobid")
set @CreatedDate = Now()
UpsertData('guidDE',3,'SubscriberKey',@SubscriberKey,"JobID",@JobID,"CreatedDate",@CreatedDate,"GUID",@GUID)
Redirect(CloudpagesURL(1234,"GUID",@GUID,"CreatedDate",@CreatedDate))
]%%
You would then want to wrap your second cloud page (intended target page) inside of a conditional to determine if the GUID passed in the url exists in the DE or not.
Something like:
%%[
SET @GUIDRows = LOOKUPROWS("guidDE,"SubscriberKey",@SubscriberKey,"JobID",@JobID,"CreatedDate",@CreatedDate,"GUID",@GUID)
IF ROWCOUNT(@GUIDRows) > 0 THEN
<<YOUR PAGE CONTENT>>
ELSE
<<EXPIRED CONTENT>>
ENDIF
]%%
Essentially this will make it so that CloudPage 1 is only called when the link is clicked in the email, which will set the GUID for the page with a 1 hr lifespan. It will then redirect you to CloudPage 2 (your intended target page) which will then do a lookuprows to the GUID DE to check if the GUID as well as the relevant subscriber/job data is valid (extra validation in case the impossible happens and you get a duplicate GUID). If it is, then it will display the expected page. If it is not (e.g. been over an hour long) then it will display error content stating to go back to the email and click the link again.
Please do note that with 2 cloudpages you could be looking at paying 2 super messages per click due to the 2 required viewings to get to your target page (not sure if you can have the first CP be a code repository or not - if so that may save you some money). This also is not foolproof and depending on the page and your customers it may provide a bad user experience.