Az S3 presigned URL (előre aláírt URL) egy ideiglenes link egy privát bucket egyetlen objektumára. A lekérdezési karakterláncában aláírást hordoz, így aki birtokolja, AWS-hitelesítő adatok nélkül letöltheti (vagy feltöltheti) azt az objektumot a link lejártáig, a bucket pedig soha nem válik nyilvánossá. A saját kulcsaiddal hozod létre, a kódodban vagy az AWS CLI-ből, és 1 másodperctől 7 napig tarthat. Ez az útmutató bemutatja, hogyan működik, mit jelent minden X-Amz-* paraméter, meddig tarthat, kódot ad letöltéshez és feltöltéshez, és sorra veszi a leggyakoribb hibákat. A korlátok az AWS és a Cloudflare 2026 októberi dokumentációjából származnak.
S3 presigned URL-ek egy pillantással
| Kérdés | Válasz |
|---|---|
| Mire ad jogot? | Egy műveletre (GET, PUT, HEAD, DELETE…) egy objektumon |
| Maximális lejárat | 7 nap (604 800 másodperc) SigV4-gyel és IAM-felhasználói kulcsokkal |
| Lejárat ideiglenes kulcsokkal | Akkor ér véget, amikor a szerepmunkamenet vagy az STS-hitelesítő adatok, amelyik előbb |
| Az S3-konzol tartománya | 1 perctől 12 óráig |
| Alapértelmezett lejárat | 3600 mp az AWS CLI-ben és a boto3-ban, 900 mp a JavaScript v3 presignerben |
| Többször is használható? | Igen, bárki, ahányszor csak akarja, a lejáratig |
| Visszavonható egy URL? | Nem, csak az aláíró hitelesítő adatok visszavonásával vagy egy policyben való tiltással |
| Hív az S3 felé a létrehozása? | Nem, az aláírást helyben számítja ki |
Hogyan működik egy presigned URL
- A kódod (vagy a CLI) veszi a bucketet, az objektumkulcsot, a HTTP-metódust és egy lejárati időt.
- Az SDK ezeket az értékeket a secret access key-ed segítségével, AWS Signature Version 4-gyel írja alá. Ekkor még semmi sem megy az S3 felé.
- Az így kapott URL-t odaadod valakinek: egy böngészőnek, egy kollégának, egy mobilalkalmazásnak.
- Amikor használják, az S3 újraszámolja az aláírást az URL-ben lévő access key-hez tartozó secrettel. Ha egyezik, az URL nem járt le, és az aláíró jogosult az adott műveletre, a kérés átmegy.
Az URL annak a jogosultságait hordozza, aki aláírta. Az AWS ezt egyértelműen kimondja: ha az URL-t létrehozó IAM-felhasználó vagy szerep nem olvashatja az objektumot, az URL 403-at ad, bármennyire érvényes is az aláírás.
Mit jelentenek az X-Amz paraméterek
Egy SigV4 presigned URL így néz ki (sortörésekkel):
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
| Paraméter | Jelentés |
|---|---|
X-Amz-Algorithm | Az aláírási algoritmus: SigV4 esetén AWS4-HMAC-SHA256 |
X-Amz-Credential | Access key ID és hatókör: <key-id>/<YYYYMMDD>/<region>/s3/aws4_request |
X-Amz-Date | Az aláírás időpontja UTC-ben, yyyyMMddTHHmmssZ formában |
X-Amz-Expires | Hány másodpercig érvényes az URL az X-Amz-Date után, 1 és 604800 között |
X-Amz-SignedHeaders | Az aláírás által lefedett fejlécek, mindig legalább a host |
X-Amz-Signature | Az aláírás, 64 hexadecimális karakter |
X-Amz-Security-Token | Csak akkor szerepel, ha az URL-t ideiglenes hitelesítő adatokkal írták alá (STS, szerepek, EC2, ECS, SSO) |
Ha bármelyik aláírt részt (a kulcsot, a metódust, a lejáratot vagy egy aláírt fejlécet) megváltoztatod, az aláírás már nem egyezik. Figyelj arra is, mit árul el az URL nyílt szövegben: a bucket nevét, a teljes objektumkulcsot és az access key ID-det. A secret key soha nincs az URL-ben.
Meddig tart egy presigned URL
A korlát az aláíró hitelesítő adatoktól függ:
| Aláírva ezzel | Maximális érvényesség |
|---|---|
| IAM-felhasználói hozzáférési kulcsok (SigV4) | 7 nap, mert maga a SigV4 aláírókulcs is 7 napig érvényes |
| IAM-szerepmunkamenet (STS AssumeRole) | A munkamenet végéig, alapból 1 óra |
| EC2 instance profile | Amíg a szerep hitelesítő adatai nem rotálódnak, legfeljebb kb. 6 óra |
| ECS task role | Amíg a task hitelesítő adatai nem rotálódnak, jellemzően 1 és 6 óra között |
| Visszavont vagy törölt hitelesítő adatok | Azonnal leáll, bármit is mond az X-Amz-Expires |
| S3-konzol | 1 perc és 12 óra között választasz |
Ez magyarázza a leggyakoribb meglepetést: egy Lambda-függvényből vagy EC2-példányból 7 napot kérsz, és a link egy vagy néhány óra után megszűnik. Az URL csak addig él, amíg a mögötte lévő hitelesítő adatok. Ha hosszú linkekre van szükséged, egy dedikált IAM-felhasználóval írj alá, amely csak az adott bucketet olvashatja.
Az S3 a kérés indulásakor ellenőrzi a lejáratot. Egy nagy letöltés, amely egy másodperccel a határidő előtt indul, rendben befejeződik, de a határidő utáni újrapróbálkozás AccessDenied hibával és „Request has expired” üzenettel meghiúsul. A 604 800 másodpercnél hosszabb kérést azonnal elutasítja.
Hogyan hozz létre presigned URL-t
AWS CLI
aws s3 presign s3://my-bucket/reports/q3.pdf --expires-in 3600
A parancs egy letöltési (GET) URL-t ír alá. Az alapértelmezés 3600 másodperc, a maximum 604 800. A friss CLI-verziók mindig SigV4-et használnak, ezért gondoskodj róla, hogy legyen beállított régió. Feltöltési URL-ekhez SDK kell.
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,
)
Állítsd be kifejezetten a signature_version='s3v4' értéket. A boto3 referenciája figyelmeztet, hogy a visszafelé kompatibilitás miatt egyébként a régebbi Signature Version 2-vel is aláírhat azokban a régiókban, amelyek még elfogadják, ami csendben elhagy néhány paramétert és fejlécet, például a Range-et. A ResponseContentDisposition opcionális: hatására a böngésző tiszta néven menti el a fájlt ahelyett, hogy megnyitná.
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 }
)
Ha kihagyod az expiresIn értéket, a JavaScript presigner 900 másodpercet (15 percet) használ.
Presigned feltöltési URL-ek (PUT)
Ugyanez az elv a másik irányban is működik. Egy PutObject műveletet írsz alá egy kulcsra, és aki birtokolja az URL-t, megírhatja azt az objektumot. A fájl közvetlenül az eszközéről megy a bucketbe, a szervered soha nem kezeli a bájtokat. Ha már létezik ilyen kulcsú objektum, lecserélődik.
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,
})
Ha a content-type értéket hozzáadod a signableHeaders listához, az URL ehhez a típushoz kötődik, így egy eltérő Content-Type-pal küldött feltöltést elutasít. A boto3-ban ennek megfelelője a generate_presigned_url('put_object', Params={'Bucket': ..., 'Key': ..., 'ContentType': 'application/pdf'}), és a kliensnek ugyanazt a fejlécet kell küldenie.
Három dolog, amit böngészőből való feltöltés előtt ellenőrizz:
- CORS. A bucketnek olyan CORS-szabály kell, amely engedélyezi az originodat és a
PUTmetódust. Multipart feltöltésnél azETagfejlécet is elérhetővé kell tennie, mert a böngészőnek minden részből ki kell olvasnia. - Rögzített kulcs. A szerveren generálj egyedi kulcsot (például UUID-előtaggal), hogy egy látogató ne írhassa felül más fájlját.
- Ellenőrzőösszegek. A jelenlegi AWS SDK-k alapból CRC-ellenőrzőösszeget adnak a feltöltésekhez. Ha a presigned feltöltések egy S3-kompatibilis szolgáltatónál aláírási vagy ellenőrzőösszeg-hibával meghiúsulnak, állítsd be a kliensen a
requestChecksumCalculation: 'WHEN_REQUIRED'értéket.
A presigned POST egy külön mechanizmus egyszerű HTML-űrlapokhoz, olyan policyvel, amely korlátozhatja a méretet és a tartalomtípust. Nem minden S3-kompatibilis szolgáltató támogatja (az R2 nem), ezért a presigned PUT a jobban hordozható választás.
Nagy fájlok: presigned multipart feltöltések
Egyetlen PUT az S3-ba 5 GB-ra korlátozott, és az AWS nagyjából 100 MB-tól javasolja a multipartot. A multipart a fájlt legfeljebb 10 000 részre bontja, mindegyik 5 MiB és 5 GiB közötti (az utolsó kivételével), amelyek egymástól függetlenül, párhuzamosan és részenkénti újrapróbálkozással töltődnek fel. Az előaláírás részenként működik: a szerver elindítja a feltöltést, részenként aláír egy UploadPart URL-t, a böngésző elküldi az egyes darabokat, és visszajelzi az ETag értéküket, a szerver pedig befejezi a feltöltést.
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 }] },
})
)
Adj hozzá egy életciklus-szabályt, amely néhány nap után megszakítja a befejezetlen multipart feltöltéseket, különben az elhagyott részek továbbra is számlázott tárhelyet foglalnak.
Presigned URL-ek az R2-n, a B2-n, a Spaces-en és a Wasabin
Azok a szolgáltatók, amelyek SigV4-gyel valósítják meg az S3 API-t, ugyanazt a kódot fogadják el: csak az endpointot, a régiót és a kulcsokat cseréled. A részletek eltérnek, ezért nézd meg a szolgáltató dokumentációját:
- A Cloudflare R2 támogatja a presigned
GET,HEAD,PUTésDELETEműveletet 1 másodperc és 7 nap közötti lejárattal. A presignedPOST-ot nem támogatja, és a presigned URL-ek csak az S3 API domainjén (<ACCOUNT_ID>.r2.cloudflarestorage.com) működnek, egyéni domaineken nem. Használd aregion: 'auto'értéket. - A Backblaze B2 szerint az S3-kompatibilis API-ja támogatja az AWS CLI-vel vagy SDK-kkal generált presigned URL-eket.
- A DigitalOcean Spaces és a Wasabi ugyanazokkal az SDK-hívásokkal működik, az ő endpointjukra irányítva.
Az egyes szolgáltatók áraiért lásd az S3, R2, Spaces, Wasabi és B2 összehasonlítását.
Gyakori presigned URL-hibák és javításuk
| Hiba | Szokásos ok | Javítás |
|---|---|---|
SignatureDoesNotMatch | A metódus, a fejlécek vagy a lekérdezés eltér az aláírttól; az óra nincs szinkronban | Küldd ugyanazt a Content-Type-ot és fejléceket; szinkronizáld az órát NTP-vel |
AccessDenied „Request has expired” | Az URL túl van az X-Amz-Date + X-Amz-Expires időponton | Generálj új URL-t; rövidítsd az aláírás és a használat közötti időt |
| Az URL a kértnél korábban lejár | Ideiglenes hitelesítő adatokkal aláírva (szerep, EC2, ECS, Lambda) | Olyan hitelesítő adatokkal írj alá, amelyek a linkkel azonos ideig élnek |
ExpiredToken | Az X-Amz-Security-Token mögötti STS-munkamenet véget ért | Frissítsd a hitelesítő adatokat aláírás előtt |
403 AccessDenied egy friss URL-en | Az aláírónak nincs s3:GetObject vagy s3:PutObject jogosultsága, vagy egy policy tiltja | Add meg a jogosultságot az aláíró identitásnak; ellenőrizd a bucket policyket |
AuthorizationQueryParametersError | 604 800 másodperc feletti lejárat vagy hibás hitelesítési hatókör | Tartsd az X-Amz-Expires értéket legfeljebb 7 napon; a bucket régiójában írj alá |
| A böngészőt blokkolja a CORS | Nincs CORS-szabály a bucketen az originedre és a metódusodra | Adj hozzá egy CORS-szabályt az origineddel, GET/PUT metódussal és elérhető ETag-gel |
AccessDenied HeadersNotSigned hibával | A Range alá volt írva, de az If-Range aláírás nélkül ment | Add hozzá az If-Range fejlécet az aláírt fejlécekhez |
A fejléceket vagy lekérdezési karakterláncokat átíró vállalati proxyk is tönkreteszik az aláírásokat. Ha egy URL az egyik hálózatról működik, a másikról nem, teszteld proxy nélkül.
Biztonsági bevált gyakorlatok
Az AWS bearer tokennek nevezi a presigned URL-eket, és azt javasolja, hogy védd őket. A gyakorlatban:
- Tartsd őket rövidre. Feltöltésekhez és érzékeny fájlokhoz perceket, hétköznapi letöltésekhez órákat. Generálj újat, ha valakinek ismét szüksége van a fájlra.
- Szűk identitással írj alá. Egy dedikált IAM-felhasználó vagy szerep, amely csak olvashatja (vagy csak írhatja) az adott prefixet, korlátozza a kárt, ha egy link kiszivárog.
- Építs be korlátokat a bucket policybe. Az
s3:signatureAgefeltétel elutasítja a megadott kornál régebbi aláírásokat, azaws:SourceIppedig korlátozza, mely hálózatokról használhatók. - Ne naplózd őket. Az alkalmazásnaplókban, analitikában vagy csevegési előzményekben szereplő teljes presigned URL-ek a lejáratukig működő hitelesítő adatok.
- Számolj azzal, ami hiányzik belőlük. Nincs jelszó, nincs letöltésszámláló és nincs linkenkénti visszavonás, ezért tegyél eléjük egy alkalmazást, ha ezekre szükséged van.
A megosztási oldalról részletesen, olyan lehetőségekkel, amelyek ezeket az ellenőrzéseket is hozzáadják: hogyan oszthatsz meg S3-fájlokat a bucket nyilvánossá tétele nélkül.
Hogyan használja a Nubbo a presigned URL-eket
A Nubbo erre a mintára épül. Amikor a fájlkezelőben feltöltesz, a szerver aláír egy PUT műveletet (vagy 100 MB-tól egy multipart feltöltést három párhuzamos résszel), a böngésződ pedig közvetlenül a bucketedbe küldi a bájtokat. Az egyes fájlok letöltése egy óráig érvényes presigned GET URL-ekkel történik. A hozzáférési kulcsaidat AES-256-GCM titkosítással tároljuk, és csak a szerveren használjuk őket aláírásra.
A megosztási linkek azt adják hozzá, ami a nyers presigned URL-ekből hiányzik: opcionális jelszót, lejárati dátumot és letöltési korlátot, amelyeket a Nubbo ellenőriz, mielőtt rövid élettartamú URL-t ad ki, és bármikor kikapcsolhatsz egy linket. A több fájlt tartalmazó ZIP-letöltéseket a böngésződ állítja össze, minden fájlt közvetlenül a bucketedből letöltve: a Nubbo soha nem látja a tartalmat. Egy őszinte kivétel: az előnézeti képek a saját bucketedbe kerülnek a .nubbo-thumbs/ alá. Ugyanígy működik az Amazon S3, a Cloudflare R2, a DigitalOcean Spaces, a Wasabi, a Backblaze B2 és a nyilvános S3-kompatibilis endpointok esetén.
Gyakori kérdések
Mi az a presigned URL az S3-ban?
Egy hagyományos HTTPS-link egy privát bucket egyetlen objektumára, amelynek lekérdezési karakterláncához aláírást fűztek. Aki birtokolja a linket, a lejáratig elvégezheti azt az egyetlen műveletet, amelyre aláírták, általában egy letöltést (GET) vagy feltöltést (PUT). A bucket privát marad, és a link használójának nincs szüksége AWS-hitelesítő adatokra.
Mi egy S3 presigned URL maximális lejárati ideje?
Hét nap (604 800 másodperc), ha Signature Version 4-gyel és hosszú távú IAM-felhasználói kulcsokkal írod alá. Az ideiglenes hitelesítő adatokkal (például felvett szereppel vagy EC2 instance profile-lal) aláírt URL akkor is leáll, amikor ezek a hitelesítő adatok lejárnak, ha hosszabbat kértél. Az S3-konzolban 1 perc és 12 óra között választhatsz.
Mit jelent az X-Amz-Algorithm, az X-Amz-Credential, az X-Amz-Date, az X-Amz-Expires, az X-Amz-SignedHeaders és az X-Amz-Signature?
Ezek a SigV4 hitelesítési paraméterei. Az Algorithm az aláírási módszer (AWS4-HMAC-SHA256), a Credential az access key ID-d a dátum, a régió és a szolgáltatás hatókörével, a Date az aláírás időpontja, az Expires az, hogy hány másodpercig érvényes, a SignedHeaders az aláírás által lefedett fejléceket sorolja fel, a Signature pedig maga az aláírás. Az X-Amz-Security-Token csak akkor jelenik meg, ha az URL-t ideiglenes hitelesítő adatokkal írták alá.
Visszavonhatok egy S3 presigned URL-t a lejárata előtt?
Egyenként nem. Egy presigned URL csak akkor áll le korábban, ha az aláíró hitelesítő adatokat visszavonják, törlik vagy kikapcsolják, vagy ha egy bucket policy megtagadja a kérést. Ha egyes linkeket külön kell visszavonnod, tegyél elé egy alkalmazást, amely csak a saját ellenőrzései után ad ki rövid élettartamú URL-eket.
Biztonságosak az S3 presigned URL-ek?
Az aláírás nem hamisítható és nem módosítható, a bucket pedig privát marad. Az AWS azonban bearer tokenként írja le a presigned URL-eket: bárki, aki megszerzi a linket, használhatja, ahányszor csak akarja, a lejáratig. Tartsd rövidre a lejárati időt, használj HTTPS-t, és ne tedd közzé a linkeket olyan helyen, ahonnan kimásolhatók.
Működnek a presigned URL-ek a Cloudflare R2, a Backblaze B2 vagy a Wasabi szolgáltatással?
Azok a szolgáltatók, amelyek Signature Version 4-gyel valósítják meg az S3 API-t, általában támogatják őket, és ugyanazokat az SDK-hívásokat használod a szolgáltató endpointjával. A Cloudflare R2 például támogatja a presigned GET, HEAD, PUT és DELETE műveletet 1 másodperc és 7 nap közötti lejárattal, de a POST űrlapos feltöltést és az egyéni domaineket nem.
Miért ad a presigned URL-em SignatureDoesNotMatch hibát?
Az AWS három gyakori okot sorol fel: a számítógép órája nincs szinkronban, egy proxy módosítja a fejléceket vagy a lekérdezési karakterláncot, vagy a kérés metódusa, fejlécei vagy paraméterei eltérnek az aláírtaktól. Feltöltésnél a szokásos bűnös az, hogy más Content-Type-ot küldesz, mint amellyel az URL készült.
Források
Az árak és korlátok az alábbi hivatalos oldalakról származnak. A szolgáltatók módosítják őket, ezért döntés előtt ellenőrizd.
- Amazon S3: objektumok letöltése és feltöltése presigned URL-ekkel
- AWS IAM: hitelesítési módszerek (SigV4 lekérdezési paraméterek)
- Amazon S3 API: kérések hitelesítése lekérdezési paraméterekkel (SigV4)
- AWS CLI referencia: s3 presign
- Boto3 referencia: generate_presigned_url
- AWS SDK for JavaScript v3: @aws-sdk/s3-request-presigner
- Amazon S3: a multipart feltöltés korlátai
- AWS SDKs and Tools: adatintegritás-védelem az Amazon S3-hoz
- Cloudflare R2: presigned URL-ek
- Backblaze: támogatja a B2 S3-kompatibilis API a presigned URL-eket?