Presigned URL v S3 je dočasný odkaz na jeden objekt v súkromnom buckete. V query stringu nesie podpis, takže ktokoľvek, kto ho má, môže tento objekt stiahnuť (alebo nahrať) bez prihlasovacích údajov AWS, kým odkaz nevyprší, a bucket sa nikdy nestane verejným. Vytvoríte ju vlastnými kľúčmi, vo svojom kóde alebo z AWS CLI, a môže platiť od 1 sekundy do 7 dní. Tento návod vysvetľuje, ako funguje, čo znamená každý parameter X-Amz-*, ako dlho môže platiť, kód na sťahovanie a nahrávanie a chyby, na ktoré pravdepodobne narazíte. Limity pochádzajú z dokumentácie AWS a Cloudflare k októbru 2026.
Presigned URL v S3 v skratke
| Otázka | Odpoveď |
|---|---|
| Čo umožňuje? | Jednu operáciu (GET, PUT, HEAD, DELETE…) na jednom objekte |
| Maximálna platnosť | 7 dní (604 800 sekúnd) so SigV4 a kľúčmi používateľa IAM |
| Platnosť s dočasnými kľúčmi | Končí s koncom relácie roly alebo údajov STS, podľa toho, čo nastane skôr |
| Rozsah v konzole S3 | 1 minúta až 12 hodín |
| Predvolená platnosť | 3 600 s v AWS CLI a boto3, 900 s v presigneri JavaScript v3 |
| Dá sa použiť viackrát? | Áno, koľkokrát ktokoľvek chce, kým nevyprší |
| Dá sa jedna URL zrušiť? | Nie, len zrušením podpisových údajov alebo zamietnutím v politike |
| Volá vytvorenie S3? | Nie, podpis sa počíta lokálne |
Ako presigned URL funguje
- Váš kód (alebo CLI) vezme bucket, kľúč objektu, metódu HTTP a dobu platnosti.
- SDK tieto hodnoty podpíše vaším tajným prístupovým kľúčom pomocou AWS Signature Version 4. V tomto bode sa do S3 nič neposiela.
- Výslednú URL niekomu dáte: prehliadaču, kolegovi, mobilnej aplikácii.
- Keď ju použije, S3 prepočíta podpis s tajným kľúčom, ktorý patrí prístupovému kľúču v URL. Ak sa zhoduje, URL nevypršala a podpisujúci smie danú operáciu vykonať, požiadavka prejde.
URL nesie oprávnenia toho, kto ju podpísal. AWS to hovorí jasne: ak používateľ alebo rola IAM, ktorá URL vygenerovala, nemôže objekt čítať, URL vráti 403 bez ohľadu na to, aký platný je podpis.
Čo znamenajú parametre X-Amz
Presigned URL so SigV4 vyzerá takto (zalomenia riadkov pridané):
https://my-bucket.s3.eu-west-1.amazonaws.com/reports/q3.pdf
?X-Amz-Algorithm=AWS4-HMAC-SHA256
&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20261017%2Feu-west-1%2Fs3%2Faws4_request
&X-Amz-Date=20261017T093000Z
&X-Amz-Expires=3600
&X-Amz-SignedHeaders=host
&X-Amz-Signature=5f2c...e91a
| Parameter | Význam |
|---|---|
X-Amz-Algorithm | Algoritmus podpisovania: AWS4-HMAC-SHA256 pre SigV4 |
X-Amz-Credential | ID prístupového kľúča plus rozsah: <key-id>/<YYYYMMDD>/<region>/s3/aws4_request |
X-Amz-Date | Kedy bola URL podpísaná, v UTC, yyyyMMddTHHmmssZ |
X-Amz-Expires | Koľko sekúnd je URL platná po X-Amz-Date, od 1 do 604800 |
X-Amz-SignedHeaders | Hlavičky pokryté podpisom, vždy aspoň host |
X-Amz-Signature | Podpis, 64 hexadecimálnych znakov |
X-Amz-Security-Token | Prítomný len vtedy, keď bola URL podpísaná dočasnými prihlasovacími údajmi (STS, roly, EC2, ECS, SSO) |
Ak zmeníte akúkoľvek podpísanú časť (kľúč, metódu, platnosť alebo podpísanú hlavičku), podpis sa už nezhoduje. Všimnite si aj to, čo URL prezrádza v čitateľnej podobe: názov bucketu, celý kľúč objektu a ID vášho prístupového kľúča. Tajný kľúč v URL nikdy nie je.
Ako dlho presigned URL platí
Limit závisí od prihlasovacích údajov, ktoré ju podpisujú:
| Podpísané pomocou | Maximálna platnosť |
|---|---|
| Prístupové kľúče používateľa IAM (SigV4) | 7 dní, pretože samotný podpisový kľúč SigV4 platí 7 dní |
| Relácia roly IAM (STS AssumeRole) | Do konca relácie, predvolene 1 hodina |
| Profil inštancie EC2 | Do rotácie údajov roly, najviac približne 6 hodín |
| Rola úlohy ECS | Do rotácie údajov úlohy, zvyčajne každých 1 až 6 hodín |
| Akékoľvek zrušené alebo zmazané údaje | Prestane okamžite, bez ohľadu na X-Amz-Expires |
| Konzola S3 | Volíte od 1 minúty do 12 hodín |
To vysvetľuje najčastejšie prekvapenie: z funkcie Lambda alebo inštancie EC2 požiadate o 7 dní a odkaz po hodine či niekoľkých hodinách prestane fungovať. URL žije len tak dlho ako prihlasovacie údaje za ňou. Ak potrebujete dlhé odkazy, podpisujte vyhradeným používateľom IAM, ktorý má prístup na čítanie len k tomuto bucketu.
S3 kontroluje platnosť pri začiatku požiadavky. Veľké sťahovanie, ktoré začne sekundu pred termínom, normálne dobehne, ale opakovaný pokus po termíne zlyhá s AccessDenied a správou „Request has expired“. Požiadavka na viac ako 604 800 sekúnd sa rovno odmietne.
Ako vygenerovať presigned URL
AWS CLI
aws s3 presign s3://my-bucket/reports/q3.pdf --expires-in 3600
Príkaz podpíše URL na stiahnutie (GET). Predvolená hodnota je 3 600 sekúnd a maximum 604 800. Novšie verzie CLI vždy používajú SigV4, preto sa uistite, že máte nastavený región. Na URL pre nahrávanie potrebujete SDK.
Python (boto3)
import boto3
from botocore.config import Config
s3 = boto3.client('s3', region_name='eu-west-1', config=Config(signature_version='s3v4'))
url = s3.generate_presigned_url(
ClientMethod='get_object',
Params={
'Bucket': 'my-bucket',
'Key': 'reports/q3.pdf',
'ResponseContentDisposition': 'attachment; filename="q3.pdf"',
},
ExpiresIn=3600,
)
Nastavte signature_version='s3v4' výslovne. Referencia boto3 upozorňuje, že kvôli spätnej kompatibilite môže inak podpisovať staršou Signature Version 2 v regiónoch, ktoré ju ešte prijímajú, čo potichu vynechá niektoré parametre a hlavičky ako Range. ResponseContentDisposition je voliteľný: prehliadač vďaka nemu súbor uloží s čistým názvom, namiesto toho, aby ho otvoril priamo.
JavaScript (AWS SDK v3)
import { S3Client, GetObjectCommand } from '@aws-sdk/client-s3'
import { getSignedUrl } from '@aws-sdk/s3-request-presigner'
const client = new S3Client({ region: 'eu-west-1' })
const url = await getSignedUrl(
client,
new GetObjectCommand({ Bucket: 'my-bucket', Key: 'reports/q3.pdf' }),
{ expiresIn: 3600 }
)
Ak vynecháte expiresIn, presigner v JavaScripte použije 900 sekúnd (15 minút).
Presigned URL na nahrávanie (PUT)
Rovnaký princíp funguje aj opačným smerom. Podpíšete PutObject pre jeden kľúč a ktokoľvek, kto má URL, môže tento objekt zapísať. Súbor ide priamo z jeho zariadenia do bucketu a váš server sa bajtov nikdy nedotkne. Ak objekt s týmto kľúčom už existuje, nahradí sa.
import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3'
import { getSignedUrl } from '@aws-sdk/s3-request-presigner'
const client = new S3Client({ region: 'eu-west-1' })
const url = await getSignedUrl(
client,
new PutObjectCommand({
Bucket: 'my-bucket',
Key: 'incoming/brief.pdf',
ContentType: 'application/pdf',
}),
{ expiresIn: 900, signableHeaders: new Set(['content-type']) }
)
await fetch(url, {
method: 'PUT',
headers: { 'Content-Type': 'application/pdf' },
body: file,
})
Pridanie content-type do signableHeaders viaže URL na tento typ, takže nahratie s iným Content-Type sa odmietne. V boto3 je ekvivalentom generate_presigned_url('put_object', Params={'Bucket': ..., 'Key': ..., 'ContentType': 'application/pdf'}) a klient musí poslať rovnakú hlavičku.
Tri veci, ktoré treba skontrolovať pred nahrávaním z prehliadača:
- CORS. Bucket potrebuje pravidlo CORS, ktoré povoľuje váš pôvod a metódu
PUT. Pri multipart nahrávaní musí sprístupniť aj hlavičkuETag, pretože prehliadač ju musí prečítať z každej časti. - Pevný kľúč. Generujte jedinečný kľúč na serveri (napríklad s prefixom UUID), aby návštevník nemohol prepísať súbor niekoho iného.
- Kontrolné súčty. Súčasné SDK AWS predvolene pridávajú k nahratiam kontrolný súčet CRC. Ak presigned nahrávanie u S3 kompatibilného poskytovateľa zlyháva s chybami podpisu alebo kontrolného súčtu, nastavte na klientovi
requestChecksumCalculation: 'WHEN_REQUIRED'.
Presigned POST je samostatný mechanizmus pre bežné HTML formuláre s politikou, ktorá môže obmedziť veľkosť a typ obsahu. Nie každý S3 kompatibilný poskytovateľ ho podporuje (R2 nie), takže presigned PUT je prenosnejšia voľba.
Veľké súbory: presigned multipart nahrávanie
Jeden PUT do S3 je obmedzený na 5 GB a AWS odporúča multipart približne od 100 MB. Multipart rozdelí súbor až na 10 000 častí, každú od 5 MiB do 5 GiB okrem poslednej, ktoré sa nahrávajú nezávisle, paralelne a s opakovaním pre každú časť. Podpisovanie funguje po častiach: server začne nahrávanie, podpíše jednu URL UploadPart pre každú časť, prehliadač pošle každý kus a vráti jeho ETag a server nahrávanie dokončí.
import {
CreateMultipartUploadCommand,
UploadPartCommand,
CompleteMultipartUploadCommand,
} from '@aws-sdk/client-s3'
const { UploadId } = await client.send(
new CreateMultipartUploadCommand({ Bucket: 'my-bucket', Key: 'video/raw.mov' })
)
const partUrl = await getSignedUrl(
client,
new UploadPartCommand({ Bucket: 'my-bucket', Key: 'video/raw.mov', UploadId, PartNumber: 1 }),
{ expiresIn: 3600 }
)
await client.send(
new CompleteMultipartUploadCommand({
Bucket: 'my-bucket',
Key: 'video/raw.mov',
UploadId,
MultipartUpload: { Parts: [{ PartNumber: 1, ETag: etagFromPartResponse }] },
})
)
Pridajte pravidlo životného cyklu, ktoré po niekoľkých dňoch zruší nedokončené multipart nahrávania, inak opustené časti naďalej zaberajú účtované úložisko.
Presigned URL v R2, B2, Spaces a Wasabi
Poskytovatelia, ktorí implementujú S3 API so SigV4, prijímajú rovnaký kód: meníte len endpoint, región a kľúče. Detaily sa líšia, preto si overte dokumentáciu poskytovateľa:
- Cloudflare R2 podporuje presigned
GET,HEAD,PUTaDELETEs platnosťou od 1 sekundy do 7 dní. Nepodporuje presignedPOSTa presigned URL fungujú len na doméne S3 API (<ACCOUNT_ID>.r2.cloudflarestorage.com), nie na vlastných doménach. Použiteregion: 'auto'. - Backblaze B2 uvádza, že jeho S3 kompatibilné API podporuje presigned URL vygenerované cez AWS CLI alebo SDK.
- DigitalOcean Spaces a Wasabi fungujú s rovnakými volaniami SDK nasmerovanými na ich endpointy.
Ceny jednotlivých poskytovateľov nájdete v porovnaní S3, R2, Spaces, Wasabi a B2.
Časté chyby presigned URL a ich riešenie
| Chyba | Zvyčajná príčina | Riešenie |
|---|---|---|
SignatureDoesNotMatch | Metóda, hlavičky alebo query sa líšia od podpísaných; nesynchronizované hodiny | Pošlite rovnaký Content-Type a hlavičky; synchronizujte hodiny cez NTP |
AccessDenied „Request has expired“ | URL je po X-Amz-Date + X-Amz-Expires | Vygenerujte novú URL; skráťte čas medzi podpísaním a použitím |
| URL vyprší skôr, než ste žiadali | Podpísaná dočasnými údajmi (rola, EC2, ECS, Lambda) | Podpisujte údajmi, ktoré žijú tak dlho, ako musí odkaz |
ExpiredToken | Relácia STS za X-Amz-Security-Token skončila | Pred podpísaním obnovte prihlasovacie údaje |
403 AccessDenied pri novej URL | Podpisujúcemu chýba s3:GetObject alebo s3:PutObject, alebo to politika zamieta | Udeľte oprávnenie podpisujúcemu subjektu; skontrolujte bucket policy |
AuthorizationQueryParametersError | Platnosť nad 604 800 sekúnd alebo chybný rozsah credential | Držte X-Amz-Expires na 7 dňoch alebo menej; podpisujte v regióne bucketu |
| Prehliadač zablokovaný cez CORS | Bucket nemá pravidlo CORS pre váš pôvod a metódu | Pridajte pravidlo CORS s vaším pôvodom, GET/PUT a sprístupneným ETag |
AccessDenied s HeadersNotSigned | Range bol podpísaný, ale If-Range bol poslaný nepodpísaný | Pridajte If-Range medzi podpísané hlavičky |
Podpisy rozbíjajú aj firemné proxy, ktoré prepisujú hlavičky alebo query stringy. Ak URL funguje z jednej siete a z inej nie, otestujte ju bez proxy.
Osvedčené bezpečnostné postupy
AWS nazýva presigned URL bearer tokenmi a odporúča ich chrániť. V praxi:
- Držte ich krátke. Minúty pri nahrávaní a citlivých súboroch, hodiny pri bežnom sťahovaní. Keď niekto súbor potrebuje znova, vygenerujte novú.
- Podpisujte úzkou identitou. Vyhradený používateľ alebo rola IAM, ktorá môže daný prefix len čítať (alebo len zapisovať), obmedzí škody, ak odkaz unikne.
- Pridajte poistky do bucket policy. Podmienka
s3:signatureAgeodmieta podpisy staršie ako určený vek aaws:SourceIpobmedzuje, z ktorých sietí sa dajú použiť. - Nezapisujte ich do logov. Úplné presigned URL v logoch aplikácie, analytike alebo histórii chatu sú funkčné prihlasovacie údaje, kým nevyprší ich platnosť.
- Počítajte s tým, čo im chýba. Nemajú heslo, počet stiahnutí ani zrušenie jednotlivých odkazov, takže keď to potrebujete, dajte pred ne aplikáciu.
Zdieľanie do hĺbky, s možnosťami, ktoré tieto kontroly pridávajú, nájdete v článku ako zdieľať súbory S3 bez zverejnenia bucketu.
Ako Nubbo používa presigned URL
Nubbo je postavené na tomto vzore. Keď nahrávate v prehliadači súborov, server podpíše PUT (alebo od 100 MB multipart nahrávanie s tromi časťami paralelne) a váš prehliadač pošle bajty priamo do vášho bucketu. Sťahovanie jednotlivých súborov používa presigned URL GET s platnosťou jednu hodinu. Vaše prístupové kľúče sú uložené zašifrované pomocou AES-256-GCM a používajú sa len na serveri na podpisovanie.
Odkazy na zdieľanie pridávajú to, čo samotným presigned URL chýba: voliteľné heslo, dátum vypršania a limit stiahnutí, ktoré Nubbo skontroluje predtým, ako vydá URL s krátkou platnosťou, a odkaz môžete kedykoľvek deaktivovať. ZIP s viacerými súbormi sa zostavuje vo vašom prehliadači, ktorý stiahne každý súbor priamo z vášho bucketu: Nubbo obsah nikdy nevidí. Jedna úprimná výnimka: náhľady sa zapisujú do vášho vlastného bucketu pod .nubbo-thumbs/. Funguje to rovnako v Amazon S3, Cloudflare R2, DigitalOcean Spaces, Wasabi, Backblaze B2 a na verejných S3 kompatibilných endpointoch.
Časté otázky
Čo je presigned URL v S3?
Je to bežný HTTPS odkaz na jeden objekt v súkromnom buckete s podpisom pridaným do query stringu. Ktokoľvek, kto má odkaz, môže vykonať jedinú operáciu, pre ktorú bol podpísaný, zvyčajne stiahnutie (GET) alebo nahratie (PUT), kým nevyprší. Bucket zostáva súkromný a osoba, ktorá odkaz používa, nepotrebuje prihlasovacie údaje AWS.
Aká je maximálna platnosť presigned URL v S3?
Sedem dní (604 800 sekúnd), keď podpisujete pomocou Signature Version 4 a dlhodobých kľúčov používateľa IAM. URL podpísaná dočasnými prihlasovacími údajmi, napríklad prevzatou rolou alebo profilom inštancie EC2, prestane fungovať, keď tieto údaje vypršia, aj keď ste požiadali o dlhšiu dobu. V konzole S3 môžete zvoliť od 1 minúty do 12 hodín.
Čo znamenajú X-Amz-Algorithm, X-Amz-Credential, X-Amz-Date, X-Amz-Expires, X-Amz-SignedHeaders a X-Amz-Signature?
Sú to autentifikačné parametre SigV4. Algorithm je metóda podpisovania (AWS4-HMAC-SHA256), Credential je ID vášho prístupového kľúča plus rozsah dátumu, regiónu a služby, Date je čas podpísania URL, Expires je počet sekúnd platnosti, SignedHeaders uvádza hlavičky pokryté podpisom a Signature je samotný podpis. X-Amz-Security-Token sa objaví, len keď bola URL podpísaná dočasnými prihlasovacími údajmi.
Môžem presigned URL v S3 zrušiť pred vypršaním?
Nie jednotlivo. Presigned URL prestane fungovať skôr, len keď sa prihlasovacie údaje, ktoré ju podpísali, zrušia, zmažú alebo deaktivujú, alebo keď bucket policy požiadavku zamietne. Ak potrebujete rušiť jednotlivé odkazy, dajte pred to aplikáciu, ktorá vydáva URL s krátkou platnosťou až po vlastných kontrolách.
Sú presigned URL v S3 bezpečné?
Podpis sa nedá sfalšovať ani zmeniť a bucket zostáva súkromný. AWS však opisuje presigned URL ako bearer tokeny: ktokoľvek, kto odkaz získa, ho môže použiť, koľkokrát chce, kým nevyprší. Nastavujte krátku platnosť, používajte HTTPS a nezverejňujte odkazy tam, kde sa dajú skopírovať.
Fungujú presigned URL s Cloudflare R2, Backblaze B2 alebo Wasabi?
Poskytovatelia, ktorí implementujú S3 API so Signature Version 4, ich vo všeobecnosti podporujú a používate rovnaké volania SDK s endpointom poskytovateľa. Cloudflare R2 napríklad podporuje presigned GET, HEAD, PUT a DELETE s platnosťou od 1 sekundy do 7 dní, ale nie nahrávanie cez formulár POST ani vlastné domény.
Prečo moja presigned URL vracia SignatureDoesNotMatch?
AWS uvádza tri časté príčiny: nesynchronizované hodiny počítača, proxy, ktorá mení hlavičky alebo query string, a požiadavku, ktorej metóda, hlavičky alebo parametre sa líšia od podpísaných. Pri nahrávaní je zvyčajne na vine odoslanie iného Content-Type, než aký sa použil pri generovaní URL.
Zdroje
Ceny a limity pochádzajú z oficiálnych stránok uvedených nižšie. Poskytovatelia ich menia, preto si ich pred rozhodnutím overte.
- Amazon S3: sťahovanie a nahrávanie objektov cez presigned URL
- AWS IAM: metódy autentifikácie (query parametre SigV4)
- Amazon S3 API: autentifikácia požiadaviek cez query parametre (SigV4)
- Referencia AWS CLI: s3 presign
- Referencia Boto3: generate_presigned_url
- AWS SDK for JavaScript v3: @aws-sdk/s3-request-presigner
- Amazon S3: limity multipart nahrávania
- AWS SDKs and Tools: ochrana integrity dát pre Amazon S3
- Cloudflare R2: presigned URL
- Backblaze: podporuje B2 S3 Compatible API presigned URL?