Ask an AI assistant how to share a page privately and it will usually warn you that an unguessable URL is not real privacy. Half of that warning is correct. This is the half that isn't, the threats a random link genuinely does not cover, and the point where you should stop and put a login in front of it instead.
Ask almost any AI assistant how to send someone an HTML page privately and you will get a version of this warning:
Simply uploading to an obscure URL is not genuinely private. Anyone who gets the URL can access it. If this is confidential, use actual authentication rather than relying on a secret URL.
It is good instinct, and it is repeated so consistently that it is worth answering properly rather than waving away. The sentence contains one claim that is true and load-bearing, and one that is a category error.
An unguessable link is a bearer credential. Possession is the whole of the authorisation. The server that hands out the page has no idea whether the person asking is the client you sent it to, a colleague they forwarded it to, or someone reading it off a screenshot.
Everything uncomfortable about the model follows from that single property, and none of it can be engineered away while keeping the thing that makes the model useful — that the recipient does not need an account.
"Security through obscurity" has a specific meaning: the system is safe only as long as nobody understands how it is built. Hide the algorithm, hide the file layout, hope nobody looks. It is a bad idea because understanding is cheap and, once someone has it, the protection is simply gone.
A random URL is not that. Everything about the design is public — you can read the format, you can read this paragraph explaining it. The only secret is a value drawn at random, which is precisely the structure of a password.
The number matters here, because it is the difference between the two arguments:
There is no guessing strategy at 190 bits. Not a slow one, not an expensive one. This is why the pattern has a proper name in the literature — a capability URL — and why it is quietly load-bearing across software you already trust:
So the honest framing is not "unguessable links are insecure". It is: a capability URL is a real primitive with real, specific limits. Those limits are the useful conversation.
None of these are about guessing, which is why "make the link longer" answers none of them.
1. Forwarding. The link travels with whoever holds it. If your reviewer sends it to a colleague, the colleague gets in. The link cannot object because it never knew who you meant in the first place.
2. Shared devices and browser history. A URL persists in history, in autocomplete, in a synced browser profile. On a machine several people use, "private" has quietly become "private until someone types the first three letters into the address bar".
3. Leakage to third parties. If the page loads scripts, fonts, or images from other services, its address can travel outward in a Referer header or an analytics payload. This is a real property of capability URLs and the reason the pattern gets criticised in security writing — worth checking on any host, including this one, if the page is genuinely sensitive.
4. No accountability, and no partial revocation. A shared secret proves somebody had the secret. It cannot tell you which person opened the page, and it cannot cut off one recipient without invalidating the link for everyone. If either of those has to be possible, you have outgrown the model — not because it is weak, but because it is answering a different question.
This is the part the AI warning gets right, and it deserves a plain answer rather than a defensive one. Reach for an identity-backed gate — SSO, Cloudflare Access, a host with team login protection, or an app with real accounts — when any of these is true:
For those, a private link is the wrong shape, and the extra login friction is the point rather than a cost. Say so early — it is much cheaper than discovering it after the fact.
And then there is the enormous middle, which is where most delivery work actually lives: a proposal for one client, a prototype for three reviewers, a report for the person who commissioned it, a build a colleague needs to click through before Friday.
For those, the honest accounting runs the other way. An account wall means your recipient signs up for a service to look at a thing you made for them — friction you are charging to the person you are trying to impress, in exchange for an audit trail nobody will read.
The layers that cover the realistic risks here are smaller than a login and do most of the work:
| Risk | The layer that covers it |
|---|---|
| Link forwarded to someone it wasn't meant for | A password, sent through a different channel from the link |
| Link outliving the reason it existed | An expiry date |
| Old copy circulating after you revised it | Replacing the file behind the same address |
| Ending up in search results | A page that is noindex by default |
| Someone screenshotting the content | Nothing. No access control solves this — not links, not logins |
That last row is the one worth sitting with. The failure people actually experience is almost never a cracked URL; it is a recipient who was allowed in and then did something you did not expect. A login does not fix that either.
A private link with a password and an expiry covers the common client-delivery case without asking your recipient to create an account. Passwords and expiry come with a free account — an anonymous upload gets the unguessable link and the 7-day window, without those two controls.
One question does most of the sorting:
Does "which specific person opened this" need an answer?
The AI warning is a reasonable default for a machine answering a stranger with no idea what they are sending — of course it points at the stronger control. It just answers a different question from the one most people are asking, which is not "what is the most secure option" but "what is the right amount of control for this specific thing I need to hand someone this afternoon".
If you want the mechanics underneath the password layer — including the difference between a password that is a real gate and one that is a prompt drawn over content the browser already downloaded — how password protection actually works covers it. And if you are weighing a memorable address against an unguessable one, those two goals genuinely conflict, which is its own trade-off worth understanding before you pick.
Two architectures live under the same 'password protected' label. One is a real gate; the other is a UI prompt the receiver can click past in 30 seconds with DevTools open.
A scheduled self-destruct retires a shared link on a date you set at upload — no reminder, no manual deletion. Here's why scheduling beats deleting by hand, how to pick the date, and what the viewer sees when the link retires.
Every lever a private link gives you — expiry, password, searchable opt-in, custom domain, white-label, analytics — what each one is for, and which are free versus paid.
miinideck turns a single HTML file into an unguessable link with optional password and expiry. Default-private, never indexed.