लेख

S3 presigned URL: ये क्या हैं, कैसे काम करते हैं, समाप्ति सीमाएँ और कोड उदाहरण

S3 presigned URL क्या है, हर X-Amz पैरामीटर का मतलब, 7 दिन की समाप्ति सीमा, अपलोड और डाउनलोड का कोड (CLI, boto3, JS) और आम errors के समाधान।

S3 presigned URL एक निजी बकेट के किसी एक ऑब्जेक्ट का अस्थायी लिंक है। इसकी query string में एक signature होता है, इसलिए जिसके पास यह है वह लिंक समाप्त होने तक उस ऑब्जेक्ट को AWS क्रेडेंशियल के बिना डाउनलोड (या अपलोड) कर सकता है, और बकेट कभी पब्लिक नहीं होता। आप इसे अपनी keys से, अपने कोड में या AWS CLI से बनाते हैं, और यह 1 सेकंड से 7 दिन तक चल सकता है। यह गाइड बताती है कि यह कैसे काम करता है, हर X-Amz-* पैरामीटर का क्या मतलब है, यह कितने समय तक चल सकता है, डाउनलोड और अपलोड का कोड और वे errors जिनसे आपका सबसे ज़्यादा सामना होगा। सीमाएँ अक्टूबर 2026 तक के AWS और Cloudflare दस्तावेज़ों से ली गई हैं।

एक नज़र में S3 presigned URL

सवालजवाब
यह क्या अनुमति देता है?एक ऑब्जेक्ट पर एक ऑपरेशन (GET, PUT, HEAD, DELETE…)
अधिकतम समाप्तिSigV4 और IAM यूज़र keys के साथ 7 दिन (604,800 सेकंड)
अस्थायी keys के साथ समाप्तिrole session या STS क्रेडेंशियल खत्म होने पर, जो भी पहले हो
S3 कंसोल की सीमा1 मिनट से 12 घंटे
डिफ़ॉल्ट समाप्तिAWS CLI और boto3 में 3,600 s, JavaScript v3 presigner में 900 s
क्या इसे कई बार इस्तेमाल किया जा सकता है?हाँ, समाप्त होने तक कोई भी जितनी बार चाहे
क्या एक URL रद्द किया जा सकता है?नहीं, सिर्फ़ साइन करने वाले क्रेडेंशियल रद्द करके या policy में अस्वीकार करके
क्या इसे बनाने पर S3 को call जाती है?नहीं, signature लोकल रूप से गणना किया जाता है

presigned URL कैसे काम करता है

  1. आपका कोड (या CLI) बकेट, ऑब्जेक्ट key, HTTP method और समाप्ति समय लेता है।
  2. SDK इन मानों को AWS Signature Version 4 से आपकी secret access key के साथ साइन करता है। इस समय S3 को कुछ नहीं भेजा जाता।
  3. आप बना हुआ URL किसी को देते हैं: एक ब्राउज़र, एक सहकर्मी, एक मोबाइल ऐप।
  4. जब वे इसे इस्तेमाल करते हैं, S3 उस secret के साथ signature फिर से गणना करता है जो URL की access key का है। अगर यह मेल खाता है, URL समाप्त नहीं हुआ है और साइन करने वाले को वह ऑपरेशन करने की अनुमति है, तो request पूरी हो जाती है।

URL में साइन करने वाले की अनुमतियाँ होती हैं। AWS इस बारे में साफ़ है: अगर URL बनाने वाला IAM यूज़र या role ऑब्जेक्ट नहीं पढ़ सकता, तो signature कितना भी मान्य हो, URL 403 लौटाता है।

X-Amz पैरामीटर का क्या मतलब है

SigV4 presigned URL ऐसा दिखता है (line breaks जोड़े गए हैं):

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
पैरामीटरमतलब
X-Amz-Algorithmसाइन करने का algorithm: SigV4 के लिए AWS4-HMAC-SHA256
X-Amz-CredentialAccess key ID और scope: <key-id>/<YYYYMMDD>/<region>/s3/aws4_request
X-Amz-DateURL कब साइन हुआ, UTC में, yyyyMMddTHHmmssZ
X-Amz-ExpiresX-Amz-Date के बाद URL कितने सेकंड मान्य है, 1 से 604800 तक
X-Amz-SignedHeaderssignature में शामिल headers, हमेशा कम से कम host
X-Amz-Signaturesignature, 64 hexadecimal अक्षर
X-Amz-Security-Tokenसिर्फ़ तब मौजूद जब URL अस्थायी क्रेडेंशियल (STS, roles, EC2, ECS, SSO) से साइन हुआ हो

कोई भी साइन किया गया हिस्सा (key, method, समाप्ति या कोई साइन किया गया header) बदलें और signature मेल नहीं खाएगा। यह भी ध्यान दें कि URL सादे टेक्स्ट में क्या दिखाता है: बकेट का नाम, ऑब्जेक्ट की पूरी key और आपकी access key ID। secret key कभी URL में नहीं होती।

presigned URL कितने समय तक चलता है

सीमा उन क्रेडेंशियल पर निर्भर करती है जो इसे साइन करते हैं:

किससे साइन किया गयाअधिकतम वैधता
IAM यूज़र access keys (SigV4)7 दिन, क्योंकि SigV4 signing key खुद 7 दिन के लिए मान्य होती है
IAM role session (STS AssumeRole)session खत्म होने तक, डिफ़ॉल्ट रूप से 1 घंटा
EC2 instance profilerole क्रेडेंशियल बदलने तक, अधिकतम लगभग 6 घंटे
ECS task roletask क्रेडेंशियल बदलने तक, आमतौर पर हर 1 से 6 घंटे
कोई भी क्रेडेंशियल रद्द या हटाए गएतुरंत बंद, X-Amz-Expires कुछ भी कहे
S3 कंसोलआप 1 मिनट से 12 घंटे के बीच चुनते हैं

इससे सबसे आम हैरानी समझ आती है: आप किसी Lambda function या EC2 instance से 7 दिन माँगते हैं और लिंक एक घंटे या कुछ घंटों में बंद हो जाता है। URL उतना ही लंबा चलता है जितने उसके पीछे के क्रेडेंशियल। अगर आपको लंबे लिंक चाहिए, तो ऐसे समर्पित IAM यूज़र से साइन करें जिसके पास सिर्फ़ उस बकेट का read एक्सेस हो।

S3 समाप्ति की जाँच request शुरू होने पर करता है। समय सीमा से एक सेकंड पहले शुरू हुआ बड़ा डाउनलोड सामान्य रूप से पूरा होता है, लेकिन समय सीमा के बाद की दोबारा कोशिश AccessDenied और “Request has expired” संदेश के साथ विफल होती है। 604,800 सेकंड से ज़्यादा माँगना सीधे अस्वीकार हो जाता है।

presigned URL कैसे बनाएँ

AWS CLI

aws s3 presign s3://my-bucket/reports/q3.pdf --expires-in 3600

यह command डाउनलोड (GET) URL साइन करता है। डिफ़ॉल्ट 3,600 सेकंड है और अधिकतम 604,800। हाल के CLI वर्ज़न हमेशा SigV4 इस्तेमाल करते हैं, इसलिए पक्का करें कि कोई क्षेत्र कॉन्फ़िगर है। अपलोड URL के लिए आपको 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,
)

signature_version='s3v4' साफ़ तौर पर सेट करें। boto3 reference चेतावनी देता है कि पुरानी compatibility के लिए, वरना यह उन क्षेत्रों में पुराने Signature Version 2 से साइन कर सकता है जो उसे अब भी स्वीकार करते हैं, जिससे Range जैसे कुछ पैरामीटर और headers चुपचाप हट जाते हैं। ResponseContentDisposition वैकल्पिक है: इससे ब्राउज़र फ़ाइल को inline खोलने के बजाय साफ़ नाम से सहेजता है।

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 }
)

अगर आप expiresIn छोड़ देते हैं, तो JavaScript presigner 900 सेकंड (15 मिनट) इस्तेमाल करता है।

presigned अपलोड URL (PUT)

यही विचार दूसरी दिशा में भी काम करता है। आप एक key के लिए PutObject साइन करते हैं और जिसके पास URL है वह वह ऑब्जेक्ट लिख सकता है। फ़ाइल सीधे उनके डिवाइस से बकेट में जाती है और आपका सर्वर कभी bytes नहीं संभालता। अगर उस key वाला ऑब्जेक्ट पहले से है, तो वह बदल दिया जाता है।

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,
})

signableHeaders में content-type जोड़ने से URL उसी type से बँध जाता है, इसलिए अलग Content-Type वाला अपलोड अस्वीकार हो जाता है। boto3 में इसका समकक्ष generate_presigned_url('put_object', Params={'Bucket': ..., 'Key': ..., 'ContentType': 'application/pdf'}) है, और क्लाइंट को वही header भेजना होता है।

ब्राउज़र से अपलोड करने से पहले तीन बातें जाँचें:

  • CORS। बकेट को एक CORS नियम चाहिए जो आपके origin और PUT method की अनुमति दे। multipart अपलोड के लिए इसे ETag header भी expose करना होगा, क्योंकि ब्राउज़र को इसे हर part से पढ़ना होता है।
  • तय key। सर्वर पर एक अनोखी key बनाएँ (उदाहरण के लिए UUID prefix के साथ), ताकि कोई विज़िटर किसी और की फ़ाइल overwrite न कर सके।
  • Checksums। मौजूदा AWS SDK डिफ़ॉल्ट रूप से अपलोड में एक CRC checksum जोड़ते हैं। अगर किसी S3-compatible प्रोवाइडर पर presigned अपलोड signature या checksum errors के साथ विफल हों, तो क्लाइंट पर requestChecksumCalculation: 'WHEN_REQUIRED' सेट करें।

Presigned POST सादे HTML forms के लिए एक अलग तरीका है, एक policy के साथ जो आकार और content type सीमित कर सकती है। हर S3-compatible प्रोवाइडर इसे सपोर्ट नहीं करता (R2 नहीं करता), इसलिए presigned PUT ज़्यादा portable विकल्प है।

बड़ी फ़ाइलें: presigned multipart अपलोड

S3 पर एक PUT अधिकतम 5 GB का होता है, और AWS लगभग 100 MB से multipart की सलाह देता है। Multipart फ़ाइल को 10,000 तक parts में बाँटता है, हर part 5 MiB से 5 GiB का, आखिरी को छोड़कर, जो अलग-अलग, parallel में और हर part के लिए दोबारा कोशिश के साथ अपलोड होते हैं। Presigning हर part के लिए काम करता है: सर्वर अपलोड शुरू करता है, हर part के लिए एक UploadPart URL साइन करता है, ब्राउज़र हर टुकड़ा भेजता है और उसका ETag वापस बताता है, और सर्वर अपलोड पूरा करता है।

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 }] },
  })
)

एक lifecycle नियम जोड़ें जो अधूरे multipart अपलोड को कुछ दिनों बाद abort कर दे, वरना छोड़े गए parts बिल योग्य स्टोरेज घेरते रहते हैं।

R2, B2, Spaces और Wasabi पर presigned URL

जो प्रोवाइडर SigV4 के साथ S3 API लागू करते हैं, वे वही कोड स्वीकार करते हैं: आप सिर्फ़ endpoint, क्षेत्र और keys बदलते हैं। विवरण अलग होते हैं, इसलिए प्रोवाइडर के दस्तावेज़ देखें:

  • Cloudflare R2, 1 सेकंड से 7 दिन की समाप्ति के साथ presigned GET, HEAD, PUT और DELETE को सपोर्ट करता है। यह presigned POST को सपोर्ट नहीं करता, और presigned URL सिर्फ़ S3 API डोमेन (<ACCOUNT_ID>.r2.cloudflarestorage.com) पर काम करते हैं, custom domains पर नहीं। region: 'auto' इस्तेमाल करें।
  • Backblaze B2 के अनुसार उसका S3-compatible API, AWS CLI या SDK से बने presigned URL को सपोर्ट करता है।
  • DigitalOcean Spaces और Wasabi उनके endpoint की ओर किए गए उन्हीं SDK calls के साथ काम करते हैं।

हर प्रोवाइडर की कीमतों के लिए S3, R2, Spaces, Wasabi और B2 की तुलना देखें।

presigned URL के आम errors और उन्हें कैसे ठीक करें

Errorआम कारणसमाधान
SignatureDoesNotMatchMethod, headers या query साइन किए गए से अलग हैं; घड़ी sync में नहींवही Content-Type और headers भेजें; घड़ी को NTP से sync करें
AccessDenied “Request has expired”URL, X-Amz-Date + X-Amz-Expires से आगे निकल चुका हैनया URL बनाएँ; साइन करने और इस्तेमाल के बीच का अंतर कम करें
URL माँगे गए से पहले समाप्त होता हैअस्थायी क्रेडेंशियल (role, EC2, ECS, Lambda) से साइन हुआऐसे क्रेडेंशियल से साइन करें जो लिंक जितने लंबे चलें
ExpiredTokenX-Amz-Security-Token के पीछे का STS session खत्म हो गया हैसाइन करने से पहले क्रेडेंशियल रीफ़्रेश करें
नए URL पर 403 AccessDeniedसाइन करने वाले के पास s3:GetObject या s3:PutObject नहीं है, या कोई policy इसे अस्वीकार करती हैसाइन करने वाले principal को अनुमति दें; bucket policies जाँचें
AuthorizationQueryParametersError604,800 सेकंड से ज़्यादा समाप्ति या गलत credential scopeX-Amz-Expires को 7 दिन या कम रखें; बकेट के क्षेत्र में साइन करें
ब्राउज़र CORS से ब्लॉकबकेट पर आपके origin और method के लिए कोई CORS नियम नहींअपने origin, GET/PUT और exposed ETag के साथ CORS नियम जोड़ें
HeadersNotSigned के साथ AccessDeniedRange साइन हुआ था लेकिन If-Range बिना साइन किए भेजा गयाIf-Range को साइन किए गए headers में जोड़ें

headers या query strings बदलने वाले कॉर्पोरेट proxies भी signatures तोड़ देते हैं। अगर कोई URL एक नेटवर्क से काम करता है और दूसरे से नहीं, तो proxy के बिना टेस्ट करें।

सुरक्षा के सबसे अच्छे तरीके

AWS, presigned URL को bearer tokens कहता है और उन्हें सुरक्षित रखने की सलाह देता है। व्यवहार में:

  • इन्हें छोटा रखें। अपलोड और संवेदनशील फ़ाइलों के लिए मिनट, सामान्य डाउनलोड के लिए घंटे। जब किसी को फ़ाइल फिर से चाहिए, तो नया बनाएँ।
  • सीमित पहचान से साइन करें। एक समर्पित IAM यूज़र या role जो संबंधित prefix को सिर्फ़ पढ़ (या सिर्फ़ लिख) सकता है, लिंक लीक होने पर नुकसान सीमित करता है।
  • bucket policy में सुरक्षा जोड़ें। s3:signatureAge condition एक तय उम्र से पुराने signatures अस्वीकार करती है, और aws:SourceIp सीमित करता है कि कौन-से नेटवर्क इन्हें इस्तेमाल कर सकते हैं।
  • इन्हें log न करें। ऐप्लिकेशन logs, analytics या chat इतिहास में पूरे presigned URL समाप्त होने तक काम करने वाले क्रेडेंशियल हैं।
  • जो इनमें नहीं है, उसकी योजना बनाएँ। न पासवर्ड है, न डाउनलोड गिनती और न प्रति लिंक रद्द करना, इसलिए जब ये चाहिए तो आगे एक ऐप्लिकेशन रखें।

शेयरिंग पक्ष को गहराई से, उन विकल्पों के साथ जो ये नियंत्रण जोड़ते हैं, जानने के लिए बकेट को पब्लिक किए बिना S3 फ़ाइलें कैसे शेयर करें देखें।

Nubbo, presigned URL का इस्तेमाल कैसे करता है

Nubbo इसी पैटर्न पर बना है। जब आप एक्सप्लोरर में अपलोड करते हैं, सर्वर एक PUT साइन करता है (या, 100 MB से, तीन parts parallel में वाला multipart अपलोड) और आपका ब्राउज़र bytes सीधे आपके बकेट में भेजता है। एक-एक फ़ाइल के डाउनलोड एक घंटे के लिए मान्य presigned GET URL इस्तेमाल करते हैं। आपकी access keys AES-256-GCM से एन्क्रिप्ट करके स्टोर की जाती हैं और सिर्फ़ सर्वर पर साइन करने के लिए इस्तेमाल होती हैं।

शेयर लिंक वह जोड़ते हैं जो सीधे presigned URL में नहीं है: वैकल्पिक पासवर्ड, समाप्ति तिथि और डाउनलोड सीमा, जिनकी Nubbo थोड़े समय का URL देने से पहले जाँच करता है, और आप किसी लिंक को कभी भी निष्क्रिय कर सकते हैं। कई फ़ाइलों वाले ZIP डाउनलोड आपके ब्राउज़र में ही बनते हैं, जो हर फ़ाइल सीधे आपके बकेट से डाउनलोड करता है: Nubbo कभी सामग्री नहीं देखता। एक ईमानदार अपवाद: thumbnails आपके अपने बकेट में .nubbo-thumbs/ के अंदर लिखे जाते हैं। यह Amazon S3, Cloudflare R2, DigitalOcean Spaces, Wasabi, Backblaze B2 और पब्लिक S3-compatible endpoints पर एक जैसा काम करता है।

अक्सर पूछे जाने वाले सवाल

S3 में presigned URL क्या है?

यह एक निजी बकेट के किसी एक ऑब्जेक्ट का सामान्य HTTPS लिंक है, जिसकी query string में एक signature जोड़ा जाता है। जिसके पास लिंक है, वह समाप्त होने तक वही एक ऑपरेशन कर सकता है जिसके लिए वह साइन किया गया था, आमतौर पर डाउनलोड (GET) या अपलोड (PUT)। बकेट निजी रहता है और लिंक इस्तेमाल करने वाले को AWS क्रेडेंशियल की ज़रूरत नहीं होती।

S3 presigned URL की अधिकतम समाप्ति अवधि क्या है?

सात दिन (604,800 सेकंड), जब आप Signature Version 4 और लंबी अवधि वाली IAM यूज़र keys से साइन करते हैं। अस्थायी क्रेडेंशियल से साइन किया गया URL, जैसे assumed role या EC2 instance profile, उन क्रेडेंशियल के समाप्त होने पर काम करना बंद कर देता है, भले आपने ज़्यादा समय माँगा हो। S3 कंसोल में आप 1 मिनट से 12 घंटे के बीच चुन सकते हैं।

X-Amz-Algorithm, X-Amz-Credential, X-Amz-Date, X-Amz-Expires, X-Amz-SignedHeaders और X-Amz-Signature का क्या मतलब है?

ये SigV4 authentication पैरामीटर हैं। Algorithm साइन करने का तरीका है (AWS4-HMAC-SHA256), Credential आपकी access key ID और साथ में तारीख, क्षेत्र और सेवा का scope है, Date बताता है कि URL कब साइन हुआ, Expires बताता है कि यह कितने सेकंड मान्य रहता है, SignedHeaders उन headers की सूची है जो signature में शामिल हैं और Signature खुद signature है। X-Amz-Security-Token सिर्फ़ तब दिखता है जब URL अस्थायी क्रेडेंशियल से साइन हुआ हो।

क्या मैं S3 presigned URL को समाप्त होने से पहले रद्द कर सकता हूँ?

एक-एक करके नहीं। presigned URL समय से पहले सिर्फ़ तब काम करना बंद करता है जब उसे साइन करने वाले क्रेडेंशियल रद्द, हटाए या निष्क्रिय किए जाएँ, या जब कोई bucket policy उस request को अस्वीकार करे। अगर आपको अलग-अलग लिंक रद्द करने हैं, तो आगे एक ऐप्लिकेशन रखें जो अपनी जाँच के बाद ही थोड़े समय के URL देता है।

क्या S3 presigned URL सुरक्षित हैं?

signature को न तो जाली बनाया जा सकता है और न बदला जा सकता है, और बकेट निजी रहता है। लेकिन AWS, presigned URL को bearer tokens कहता है: जिसे भी लिंक मिल जाए, वह समाप्त होने तक जितनी बार चाहे उसे इस्तेमाल कर सकता है। समाप्ति समय छोटा रखें, HTTPS इस्तेमाल करें और लिंक ऐसी जगह न डालें जहाँ से उन्हें कॉपी किया जा सके।

क्या presigned URL, Cloudflare R2, Backblaze B2 या Wasabi के साथ काम करते हैं?

जो प्रोवाइडर Signature Version 4 के साथ S3 API लागू करते हैं, वे आमतौर पर इन्हें सपोर्ट करते हैं, और आप प्रोवाइडर के endpoint के साथ वही SDK calls इस्तेमाल करते हैं। उदाहरण के लिए, Cloudflare R2, 1 सेकंड से 7 दिन की समाप्ति के साथ presigned GET, HEAD, PUT और DELETE को सपोर्ट करता है, लेकिन POST form अपलोड और custom domains को नहीं।

मेरा presigned URL SignatureDoesNotMatch क्यों लौटाता है?

AWS तीन आम कारण बताता है: कंप्यूटर की घड़ी का sync न होना, कोई proxy जो headers या query string बदल देता है, और ऐसी request जिसका method, headers या पैरामीटर साइन किए गए से अलग हों। अपलोड में आमतौर पर गलती यह होती है कि URL बनाते समय इस्तेमाल हुए Content-Type से अलग Content-Type भेजा जाता है।

स्रोत

कीमतें और सीमाएँ नीचे दिए आधिकारिक पेजों से ली गई हैं। प्रोवाइडर इन्हें बदलते रहते हैं, इसलिए फ़ैसला लेने से पहले जाँच लें।