Cikk

S3 presigned URL-ek: mik ezek, hogyan működnek, lejárati korlátok és kódpéldák

Mi az S3 presigned URL, mit jelent minden X-Amz paraméter, a 7 napos lejárati korlát, feltöltési és letöltési kód (CLI, boto3, JS) és gyakori hibák.

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ésVálasz
Mire ad jogot?Egy műveletre (GET, PUT, HEAD, DELETE…) egy objektumon
Maximális lejárat7 nap (604 800 másodperc) SigV4-gyel és IAM-felhasználói kulcsokkal
Lejárat ideiglenes kulcsokkalAkkor ér véget, amikor a szerepmunkamenet vagy az STS-hitelesítő adatok, amelyik előbb
Az S3-konzol tartománya1 perctől 12 óráig
Alapértelmezett lejárat3600 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

  1. A kódod (vagy a CLI) veszi a bucketet, az objektumkulcsot, a HTTP-metódust és egy lejárati időt.
  2. 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é.
  3. Az így kapott URL-t odaadod valakinek: egy böngészőnek, egy kollégának, egy mobilalkalmazásnak.
  4. 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éterJelentés
X-Amz-AlgorithmAz aláírási algoritmus: SigV4 esetén AWS4-HMAC-SHA256
X-Amz-CredentialAccess key ID és hatókör: <key-id>/<YYYYMMDD>/<region>/s3/aws4_request
X-Amz-DateAz aláírás időpontja UTC-ben, yyyyMMddTHHmmssZ formában
X-Amz-ExpiresHány másodpercig érvényes az URL az X-Amz-Date után, 1 és 604800 között
X-Amz-SignedHeadersAz aláírás által lefedett fejlécek, mindig legalább a host
X-Amz-SignatureAz aláírás, 64 hexadecimális karakter
X-Amz-Security-TokenCsak 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 ezzelMaximá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 profileAmíg a szerep hitelesítő adatai nem rotálódnak, legfeljebb kb. 6 óra
ECS task roleAmí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ő adatokAzonnal leáll, bármit is mond az X-Amz-Expires
S3-konzol1 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 PUT metódust. Multipart feltöltésnél az ETag fejlé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 és DELETE műveletet 1 másodperc és 7 nap közötti lejárattal. A presigned POST-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 a region: '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

HibaSzokásos okJavítás
SignatureDoesNotMatchA metódus, a fejlécek vagy a lekérdezés eltér az aláírttól; az óra nincs szinkronbanKü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őpontonGenerá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árIdeiglenes hitelesítő adatokkal aláírva (szerep, EC2, ECS, Lambda)Olyan hitelesítő adatokkal írj alá, amelyek a linkkel azonos ideig élnek
ExpiredTokenAz X-Amz-Security-Token mögötti STS-munkamenet véget értFrissítsd a hitelesítő adatokat aláírás előtt
403 AccessDenied egy friss URL-enAz aláírónak nincs s3:GetObject vagy s3:PutObject jogosultsága, vagy egy policy tiltjaAdd meg a jogosultságot az aláíró identitásnak; ellenőrizd a bucket policyket
AuthorizationQueryParametersError604 800 másodperc feletti lejárat vagy hibás hitelesítési hatókörTartsd az X-Amz-Expires értéket legfeljebb 7 napon; a bucket régiójában írj alá
A böngészőt blokkolja a CORSNincs CORS-szabály a bucketen az originedre és a metódusodraAdj hozzá egy CORS-szabályt az origineddel, GET/PUT metódussal és elérhető ETag-gel
AccessDenied HeadersNotSigned hibávalA Range alá volt írva, de az If-Range aláírás nélkül mentAdd 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:signatureAge feltétel elutasítja a megadott kornál régebbi aláírásokat, az aws:SourceIp pedig 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.