{"id":21214,"date":"2020-02-02T10:35:00","date_gmt":"2020-02-02T10:35:00","guid":{"rendered":"http:\/\/on_the_fly_image_manipulations_secured_with_signed_urls"},"modified":"2025-10-29T12:41:01","modified_gmt":"2025-10-29T19:41:01","slug":"on_the_fly_image_manipulations_secured_with_signed_urls","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/on_the_fly_image_manipulations_secured_with_signed_urls","title":{"rendered":"Secure Image Transformations With a Signed Image URL"},"content":{"rendered":"<div>\n<div>Modern websites and mobile apps frequently showcase images of various dimensions, sometimes varying the graphics, resolutions, and look and feel for different devices (desktop, mobile, etc.); and revamping the graphics with upgrades.<\/div>\n<div><\/div>\n<div>A key benefit Cloudinary offers is an easy, intuitive, and flexible process of modifying images.<\/div>\n<div><\/div>\n<\/div>\n<div><span style=\"font-weight: 400;\">You can get full access to the Cloudinary secure URL, and all Cloudinary capability, for free and for life. Sign up for Cloudinary to get started, then follow along with this article to learn how to handle the<\/span> <span style=\"font-weight: 400;\">signed image URL<\/span> <span style=\"font-weight: 400;\">process.<\/span><\/div>\n<div><\/div>\n<div><span style=\"font-weight: 400;\">A case in point: by setting simple parameters in our dynamic URLs, you can resize or crop images, alter their shapes, and apply effects. After transforming images on the fly in the cloud and optimizing the resulting thumbnails, Cloudinary delivers them through a fast content delivery network (CDN).<\/span><\/div>\n<div>\n<div><\/div>\n<\/div>\n<div><span style=\"font-weight: 400;\">The<\/span> <span style=\"font-weight: 400;\">signed URL<\/span> <span style=\"font-weight: 400;\">is integral to this process. They include essential components like authentication information, a hash value, and an expiration date\/time, ensuring that each URL is valid only for a specific period. This time-limited access feature is crucial for maintaining the security and integrity of the images, especially in scenarios where access needs to be controlled and monitored.<\/span><\/div>\n<div><\/div>\n<div>\n<div>All that makes it a snap to view the various images derived from a single high-resolution source. Here&#8217;s an example of a dynamic image-transformation URL in action:<\/div>\n<\/div>\n<div><\/div>\n<div><a href=\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/w_100,h_80,c_fill,r_30,e_fill_light\/yellow_tulip.jpg\" target=\"_blank\" rel=\"noopener\"><strong>https:\/\/&#8230;\/image\/upload\/<span style=\"color: #bb0000;\">w_100,h_80,c_fill,r_30,e_fill_light<\/span>\/yellow_tulip.jpg<\/strong><\/a><\/div>\n<div><\/div>\n<p><a href=\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/w_100,h_80,c_fill,r_30,e_fill_light\/yellow_tulip.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" style=\"margin-left: auto; margin-right: auto;\" src=\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/w_100,h_80,c_fill,r_30,e_fill_light\/yellow_tulip.jpg\" alt=\"Image showing tulip field used in the Cloudinary secure URL project\" width=\"100\" height=\"80\" \/><\/a><\/p>\n<div><\/div>\n<div>Cloudinary&#8217;s dynamic URLs can also fetch, transform, and deliver Facebook or Twitter profile pictures\u2014in fact, any image with a public URL. For example:<\/div>\n<div><\/div>\n<div><a href=\"https:\/\/res.cloudinary.com\/demo\/image\/facebook\/w_100,h_80,c_fill,r_30,e_fill_light\/madonna.jpg\" target=\"_blank\" rel=\"noopener\"><strong>https:\/\/&#8230;\/demo\/image\/facebook\/<span style=\"color: #bb0000;\">w_100,h_80,c_fill,r_30,e_fill_light\/madonna<\/span>.jpg<\/strong><\/a><\/div>\n<div><\/div>\n<p><a href=\"https:\/\/res.cloudinary.com\/demo\/image\/facebook\/w_100,h_80,c_fill,r_30,e_fill_light\/madonna.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" style=\"margin-left: auto; margin-right: auto;\" src=\"https:\/\/res.cloudinary.com\/demo\/image\/facebook\/w_100,h_80,c_fill,r_30,e_fill_light\/madonna.jpg\" alt=\"Image showing Madonna in sunglasses to be used in the Cloudinary secure URL project\" width=\"100\" height=\"80\" \/><\/a><\/p>\n<div><\/div>\n<div>The above approach lacks security, however: anyone could delete a parameter, such as that for a watermark, by tweaking the image\u2019s dynamic URL.<\/div>\n<div><\/div>\n<div><span style=\"font-weight: 400;\">Besides image transformations, signed URLs can be used to prevent unauthorized viewers from downloading content and to prevent embedding a player on sites not owned by the content provider. This signed URL application is useful for controlling where and how content is displayed and accessed.<\/span><\/div>\n<div><\/div>\n<div>\n<div>To prevent arbitrary image fetches and edits, you can transform images while uploading them to Cloudinary or enable <a href=\"https:\/\/cloudinary.com\/blog\/how_to_quickly_build_a_stock_photo_site_using_cloudinary\" target=\"_blank\" rel=\"noopener\">Cloudinary&#8217;s strict-transformations mode<\/a> to limit the number of transformations. However, because those are manual tasks that require working with authenticated APIs, you lose some of the flexibility in image transformation. A better alternative is to secure your images.<\/div>\n<div><\/div>\n<div>To that end, check out Cloudinary&#8217;s <strong>signed image URLs<\/strong>, which impose a higher degree of security while retaining the capabilities of dynamic flexible URLs.<\/div>\n<\/div>\n<h2 id=\"sign_transformation_urls\" style=\"padding-top: 80px;\">Signed Image URL<\/h2>\n<div><span style=\"font-weight: 400;\">Cloudinary\u2019s<\/span> <span style=\"font-weight: 400;\">signed\u00a0<\/span><a href=\"https:\/\/cloudinary.com\/glossary\/image-url\"><span style=\"font-weight: 400;\">image URL<\/span><\/a><span style=\"font-weight: 400;\">\u00a0<\/span><span style=\"font-weight: 400;\">dynamically validates image signatures before display. Creating those URLs after enabling the\u00a0<\/span><b>Strict Transformations<\/b><span style=\"font-weight: 400;\">\u00a0setting on your Cloudinary account\u2019s\u00a0<\/span><b>Settings<\/b><span style=\"font-weight: 400;\">\u00a0page limits access to specific transformations and presigned URLs.<\/span><\/div>\n<div><\/div>\n<div><\/div>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" style=\"margin-left: auto; margin-right: auto;\" src=\"https:\/\/res.cloudinary.com\/cloudinary\/image\/upload\/v1390226656\/strict_settings_jz8kml.png\" alt=\"Image showing screenshot of the Cloudinary transformations area where signed image url is performed\" width=\"304\" height=\"232\" \/><\/p>\n<p><span style=\"font-weight: 400;\">It&#8217;s important to note that alternatives like signed cookies can provide similar functionality. Signed cookies offer time-limited resource access to files, much like signed URLs. However, using signed URLs in image management is often more practical for individual files, especially when dealing with images sourced from various platforms.<\/span><\/p>\n<div><\/div>\n<div>For example, take this scaled-down thumbnail, which is sourced from an image uploaded to Cloudinary:<\/div>\n<div><\/div>\n<div style=\"text-align: center;\"><a href=\"https:\/\/res.cloudinary.com\/private-demo\/image\/upload\/yellow_tulip.jpg\" target=\"_blank\" rel=\"noopener\"><strong>https:\/\/res.cloudinary.com\/private-demo\/image\/upload\/yellow_tulip.jpg<\/strong><\/a><\/div>\n<div><\/div>\n<div><\/div>\n<div><a href=\"https:\/\/res.cloudinary.com\/private-demo\/image\/upload\/yellow_tulip.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" style=\"margin-left: auto; margin-right: auto;\" src=\"https:\/\/res.cloudinary.com\/private-demo\/image\/upload\/s--VUHG5LPZ--\/c_scale,h_200,w_300\/yellow_tulip.jpg\" alt=\"Image showing field of tulips to be used in the Cloudinary signed image url project\" width=\"300\" height=\"200\" \/><\/a><\/div>\n<div><\/div>\n<div>To create a signed URL for the image (sometimes called signed images for short), set the &#8216;<span style=\"color: #bb0000;\"><strong>sign_url<\/strong><\/span>&#8216; parameter to &#8216;<strong style=\"color: #bb0000;\">true<\/strong>&#8216; when building the URL or creating an image tag. The following Ruby on Rails example creates an image tag of a 300&#215;200-pixel, center-cropped thumbnail of the original image and signs the generated URL:<\/div>\n<pre>&lt;%= cl_image_tag(\"yellow_tulip.jpg\", :sign_url =&gt; true, \n                 :width =&gt;300, :height =&gt; 200, :crop =&gt; :crop, :gravity =&gt; :center) %&gt;\n<\/pre>\n<div>\n<div>The image tag points to this CDN-based delivery URL, which contains a signature component:<\/div>\n<\/div>\n<div><\/div>\n<div><a href=\"https:\/\/res.cloudinary.com\/private-demo\/image\/upload\/s--o1_ZfmFP--\/c_crop,g_center,h_200,w_300\/yellow_tulip.jpg\" target=\"_blank\" rel=\"noopener\"><strong>https:\/\/&#8230;\/image\/upload\/<span style=\"color: #bb0000;\">s&#8211;o1_ZfmFP&#8211;<\/span>\/<span style=\"color: #000000;\">c_crop,g_center,h_200,w_300<\/span>\/yellow_tulip.jpg<\/strong><\/a><\/div>\n<div><\/div>\n<p><a href=\"https:\/\/res.cloudinary.com\/private-demo\/image\/upload\/s--o1_ZfmFP--\/c_crop,g_center,h_200,w_300\/yellow_tulip.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" style=\"margin-left: auto; margin-right: auto;\" src=\"https:\/\/res.cloudinary.com\/private-demo\/image\/upload\/s--o1_ZfmFP--\/c_crop,g_center,h_200,w_300\/yellow_tulip.jpg\" alt=\"Image showing field of tulips which includes a signed image url.\" width=\"300\" height=\"200\" \/><\/a><\/p>\n<div><\/div>\n<div>With the above setup, an attempt to apply a different transformation or add an invalid signature results in a 401 error message with the appropriate `<strong>X-Cld-Error`\u00a0<\/strong>HTTP-header response, such as this one:<\/div>\n<div><\/div>\n<div><span style=\"font-family: 'courier new', courier;\"><em><strong>https:\/\/res.cloudinary.com\/private-demo\/image\/upload\/w_400,h_300,c_crop\/yellow_tulip.jpg<\/strong><\/em><\/span><\/div>\n<div><\/div>\n<div><span style=\"font-family: 'courier new', courier;\"><em><strong>X-Cld-Error: Transformation w_400,h_300,c_crop is not allowed<\/strong><\/em><\/span><\/div>\n<div><\/div>\n<div>Below is another signed-URL example (in PHP), which applies a saturation-reduction effect and generates a circular crop.<\/div>\n<pre>&lt;?php echo cl_image_tag(\"yellow_tulip.jpg\", array( \"sign_url\" =&gt; true, \n                        \"width\" =&gt; 300, \"height\" =&gt; 200, \"crop\" =&gt; \"crop\", \n                        \"radius\" =&gt; \"max\", \"effect\" =&gt; \"saturation:-50\" )); ?&gt;\n<\/pre>\n<div><strong><a href=\"https:\/\/res.cloudinary.com\/private-demo\/image\/upload\/s--kh4rZOVi--\/c_crop,e_saturation:-50,h_200,r_max,w_300\/yellow_tulip.jpg\" target=\"_blank\" rel=\"noopener\">https:\/\/&#8230;<\/a><\/strong><a href=\"https:\/\/res.cloudinary.com\/private-demo\/image\/upload\/s--kh4rZOVi--\/c_crop,e_saturation:-50,h_200,r_max,w_300\/yellow_tulip.jpg\" target=\"_blank\" rel=\"noopener\"><strong>\/upload\/<span style=\"color: #bb0000;\">s&#8211;kh4rZOVi&#8211;<\/span>\/<span style=\"color: #000000;\">c_crop,e_saturation:-50,h_200,r_max,w_300<\/span>\/yellow_tulip.jpg<\/strong><\/a><\/div>\n<div><\/div>\n<div><a href=\"https:\/\/res.cloudinary.com\/private-demo\/image\/upload\/s--kh4rZOVi--\/c_crop,e_saturation:-50,h_200,r_max,w_300\/yellow_tulip.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" style=\"margin-left: auto; margin-right: auto;\" src=\"https:\/\/res.cloudinary.com\/private-demo\/image\/upload\/s--kh4rZOVi--\/c_crop,e_saturation:-50,h_200,r_max,w_300\/yellow_tulip.jpg\" alt=\"Image showing field of tulips which includes a signed image url and a saturation reduction effect.\" width=\"300\" height=\"200\" \/><\/a><\/div>\n<div>Behind the scenes, a Cloudinary client-integration SDK creates the signature component in the format `<strong>\/s&#8211;SIGNATURE&#8211;\/`<\/strong>, which is a Base64 encoding of a SHA-1 digest of your image\u2019s public ID and transformation string, concatenated with your API secret. If Cloudinary has already or is set to apply the transformation in question, Cloudinary skips the signature check and the signature itself can be omitted.<\/div>\n<div><\/div>\n<h2>Strict Fetch URLs<\/h2>\n<div>You can pull original images with fetch URLs on Cloudinary. Concatenating a public image\u2019s URL and Cloudinary&#8217;s delivery URL fetches the original image, transforms; optimizes, and caches it; ultimately delivering the final version through a <a href=\"https:\/\/cloudinary.com\/glossary\/cdn-security\">CDN<\/a>.<\/div>\n<div><\/div>\n<div><strong>Tip<\/strong>: To prevent dynamic fetching of images from arbitrary domains, go to your Cloudinary account&#8217;s <strong>Settings<\/strong> page, click the <strong>Security<\/strong> tab near the top, and select <strong>Fetched URL<\/strong> under <strong>Restricted media types<\/strong>.<\/div>\n<div><\/div>\n<div>Additionally, by signing fetch URLs, you bypass the strict list of fetch domains and reap the dynamicity benefit of those URLs. As a demo, the following Django code generates an image tag of a signed URL that dynamically fetches a remote image from Wikipedia:<\/div>\n<pre>cloudinary.CloudinaryImage(\n  \"http:\/\/upload.wikimedia.org\/wikipedia\/commons\/4\/44\/Tulip_-_floriade_canberra.jpg\").\n  image(type = 'fetch', sign_url = True)\n<\/pre>\n<div><a href=\"https:\/\/res.cloudinary.com\/private-demo\/image\/fetch\/s--WTWiTv3G--\/http:\/\/upload.wikimedia.org\/wikipedia\/commons\/4\/44\/Tulip_-_floriade_canberra.jpg\" target=\"_blank\" rel=\"noopener\"><strong>https:\/\/&#8230;\/fetch\/<span style=\"color: #bb0000;\">s&#8211;WTWiTv3G&#8211;<\/span>\/http:\/\/upload.wikimedia.org\/wikipedia\/commons\/4\/44\/Tulip_-_floriade_canberra.jpg<\/strong><\/a><\/div>\n<div><\/div>\n<div><a href=\"https:\/\/res.cloudinary.com\/private-demo\/image\/fetch\/s--WTWiTv3G--\/http:\/\/upload.wikimedia.org\/wikipedia\/commons\/4\/44\/Tulip_-_floriade_canberra.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" style=\"margin-left: auto; margin-right: auto;\" src=\"https:\/\/res.cloudinary.com\/private-demo\/image\/fetch\/s--9VPaJSD0--\/c_scale,w_200\/http:\/\/upload.wikimedia.org\/wikipedia\/commons\/4\/44\/Tulip_-_floriade_canberra.jpg\" alt=\"Image showing field of tulips with fetch code embedded for the signed image url project\" width=\"200\" height=\"267\" \/><\/a><\/div>\n<div><\/div>\n<div>Also, if you must fetch and\u00a0transform images from different locations, signed URLs enable you to stay strict without having to manually update your Cloudinary configurations or use the authenticated APIs. For instance, this slightly more complex Node.js example generates a signed URL of a resized, fetched image, applies effects, and adds a watermark:<\/div>\n<div><\/div>\n<pre>cloudinary.image(\n  \"http:\/\/upload.wikimedia.org\/wikipedia\/commons\/4\/44\/Tulip_-_floriade_canberra.jpg\",\n  { type: 'fetch', sign_url: true,\n    transformation: [\n     { width: 200, crop: 'scale', effect: 'saturation:30' }, \n     { overlay: \"cloudinary_icon\", opacity: 40, effect: 'brightness:200', \n       width: 0.8, flags: 'relative' }\n    ] \n  });\n<\/pre>\n<div style=\"width: 640px;\"><a href=\"https:\/\/res.cloudinary.com\/private-demo\/image\/fetch\/s--S9WLcYuC--\/c_scale,e_saturation:30,w_200\/e_brightness:200,fl_relative,l_cloudinary_icon,o_40,w_0.8\/http:\/\/upload.wikimedia.org\/wikipedia\/commons\/4\/44\/Tulip_-_floriade_canberra.jpg\" target=\"_blank\" rel=\"noopener\"><strong>https:\/\/res.cloudinary.com\/private-demo\/image\/fetch\/<span style=\"color: #bb0000;\">s&#8211;S9WLcYuC&#8211;<\/span>\/<span style=\"color: #000000;\">c_scale,e_saturation:30,w_200\/e_brightness:200,fl_relative,l_cloudinary_icon,o_40,w_0.8<\/span>\/http:\/\/upload.wikimedia.org\/wikipedia\/commons\/4\/44\/Tulip_-_floriade_canberra.jpg<\/strong><\/a><\/div>\n<div><\/div>\n<div><a href=\"https:\/\/res.cloudinary.com\/private-demo\/image\/fetch\/s--S9WLcYuC--\/c_scale,e_saturation:30,w_200\/e_brightness:200,fl_relative,l_cloudinary_icon,o_40,w_0.8\/http:\/\/upload.wikimedia.org\/wikipedia\/commons\/4\/44\/Tulip_-_floriade_canberra.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" style=\"margin-left: auto; margin-right: auto;\" src=\"https:\/\/res.cloudinary.com\/private-demo\/image\/fetch\/s--S9WLcYuC--\/c_scale,e_saturation:30,w_200\/e_brightness:200,fl_relative,l_cloudinary_icon,o_40,w_0.8\/http:\/\/upload.wikimedia.org\/wikipedia\/commons\/4\/44\/Tulip_-_floriade_canberra.jpg\" alt=\"Image showing field of tulips which includes a fetch code as well as a signed image url\" width=\"200\" height=\"267\" \/><\/a><\/div>\n<div><\/div>\n<h3>Summary<\/h3>\n<div>Coupled with a signature-based security mechanism, Cloudinary\u2019s dynamic, flexible image-fetching and\u00a0transforming URLs are your answer for effective image management. You can embed any image in your website, create a responsive design with dynamic dimensions, and update it any time by changing the intuitive and simple URL parameters in your code. All the tasks are secure and abuse proof.<\/div>\n<div><\/div>\n<div>Recall that Cloudinary&#8217;s client SDKs create signed URLs by automatically generating the signature for you. Ensure that you\u2019re running the latest versions of the SDKs:<\/div>\n<div>\u00a0<a href=\"https:\/\/cloudinary.com\/documentation\/rails_integration\" target=\"_blank\" rel=\"noopener\">Ruby on Rails<\/a>, <a href=\"https:\/\/cloudinary.com\/documentation\/php_integration\">PHP<\/a>, <a href=\"https:\/\/cloudinary.com\/documentation\/django_integration\" target=\"_blank\" rel=\"noopener\">Python &amp; Django<\/a>, <a href=\"https:\/\/cloudinary.com\/documentation\/node_integration\" target=\"_blank\" rel=\"noopener\">Node.js<\/a>, <a href=\"https:\/\/cloudinary.com\/documentation\/java_integration\" target=\"_blank\" rel=\"noopener\">Java<\/a> and others.<\/div>\n<div><\/div>\n<div>Image delivery based on signed URLs is available to all our free and paid plans. To try it out, first <strong><a href=\"https:\/\/cloudinary.com\/users\/register\/free\" target=\"_blank\" rel=\"noopener\">sign up to our free account<\/a><\/strong>.<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Modern websites and mobile apps frequently showcase images of various dimensions, sometimes varying the graphics, resolutions, and look and feel for different devices (desktop, mobile, etc.); and revamping the graphics with upgrades. A key benefit Cloudinary offers is an easy, intuitive, and flexible process of modifying images. You can get full access to the Cloudinary [&hellip;]<\/p>\n","protected":false},"author":41,"featured_media":23338,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[91,165,214,229,257,264],"class_list":["post-21214","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-django","tag-image-transformation","tag-node","tag-php","tag-ruby-on-rails","tag-security"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.6 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Secure Image Transformations With a Signed Image URL<\/title>\n<meta name=\"description\" content=\"Learn how to secure images with a signed URL to prevent arbitrary access or modification of images using Cloudinary for free.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cloudinary.com\/blog\/on_the_fly_image_manipulations_secured_with_signed_urls\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Secure Image Transformations With a Signed Image URL\" \/>\n<meta property=\"og:description\" content=\"Learn how to secure images with a signed URL to prevent arbitrary access or modification of images using Cloudinary for free.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/on_the_fly_image_manipulations_secured_with_signed_urls\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-02-02T10:35:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-10-29T19:41:01+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1647045693\/26_secure_img_transformations\/26_secure_img_transformations.jpg?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"2000\" \/>\n\t<meta property=\"og:image:height\" content=\"1100\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"NewsArticle\",\"@id\":\"https:\/\/cloudinary.com\/blog\/on_the_fly_image_manipulations_secured_with_signed_urls#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/on_the_fly_image_manipulations_secured_with_signed_urls\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Secure Image Transformations With a Signed Image URL\",\"datePublished\":\"2020-02-02T10:35:00+00:00\",\"dateModified\":\"2025-10-29T19:41:01+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/on_the_fly_image_manipulations_secured_with_signed_urls\"},\"wordCount\":1130,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/on_the_fly_image_manipulations_secured_with_signed_urls#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1647045693\/26_secure_img_transformations\/26_secure_img_transformations.jpg?_i=AA\",\"keywords\":[\"Django\",\"Image Transformation\",\"Node\",\"PHP\",\"Ruby on Rails\",\"Security\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2020\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/on_the_fly_image_manipulations_secured_with_signed_urls\",\"url\":\"https:\/\/cloudinary.com\/blog\/on_the_fly_image_manipulations_secured_with_signed_urls\",\"name\":\"Secure Image Transformations With a Signed Image URL\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/on_the_fly_image_manipulations_secured_with_signed_urls#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/on_the_fly_image_manipulations_secured_with_signed_urls#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1647045693\/26_secure_img_transformations\/26_secure_img_transformations.jpg?_i=AA\",\"datePublished\":\"2020-02-02T10:35:00+00:00\",\"dateModified\":\"2025-10-29T19:41:01+00:00\",\"description\":\"Learn how to secure images with a signed URL to prevent arbitrary access or modification of images using Cloudinary for free.\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/on_the_fly_image_manipulations_secured_with_signed_urls#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/on_the_fly_image_manipulations_secured_with_signed_urls\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/on_the_fly_image_manipulations_secured_with_signed_urls#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1647045693\/26_secure_img_transformations\/26_secure_img_transformations.jpg?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1647045693\/26_secure_img_transformations\/26_secure_img_transformations.jpg?_i=AA\",\"width\":2000,\"height\":1100,\"caption\":\"Image showing graphic representation of Cloudinary secure URL capability\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/on_the_fly_image_manipulations_secured_with_signed_urls#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Secure Image Transformations With a Signed Image URL\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"name\":\"Cloudinary Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cloudinary.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\",\"name\":\"Cloudinary Blog\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"width\":312,\"height\":60,\"caption\":\"Cloudinary Blog\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Secure Image Transformations With a Signed Image URL","description":"Learn how to secure images with a signed URL to prevent arbitrary access or modification of images using Cloudinary for free.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/cloudinary.com\/blog\/on_the_fly_image_manipulations_secured_with_signed_urls","og_locale":"en_US","og_type":"article","og_title":"Secure Image Transformations With a Signed Image URL","og_description":"Learn how to secure images with a signed URL to prevent arbitrary access or modification of images using Cloudinary for free.","og_url":"https:\/\/cloudinary.com\/blog\/on_the_fly_image_manipulations_secured_with_signed_urls","og_site_name":"Cloudinary Blog","article_published_time":"2020-02-02T10:35:00+00:00","article_modified_time":"2025-10-29T19:41:01+00:00","og_image":[{"width":2000,"height":1100,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1647045693\/26_secure_img_transformations\/26_secure_img_transformations.jpg?_i=AA","type":"image\/jpeg"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/on_the_fly_image_manipulations_secured_with_signed_urls#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/on_the_fly_image_manipulations_secured_with_signed_urls"},"author":{"name":"","@id":""},"headline":"Secure Image Transformations With a Signed Image URL","datePublished":"2020-02-02T10:35:00+00:00","dateModified":"2025-10-29T19:41:01+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/on_the_fly_image_manipulations_secured_with_signed_urls"},"wordCount":1130,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/on_the_fly_image_manipulations_secured_with_signed_urls#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1647045693\/26_secure_img_transformations\/26_secure_img_transformations.jpg?_i=AA","keywords":["Django","Image Transformation","Node","PHP","Ruby on Rails","Security"],"inLanguage":"en-US","copyrightYear":"2020","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/on_the_fly_image_manipulations_secured_with_signed_urls","url":"https:\/\/cloudinary.com\/blog\/on_the_fly_image_manipulations_secured_with_signed_urls","name":"Secure Image Transformations With a Signed Image URL","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/on_the_fly_image_manipulations_secured_with_signed_urls#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/on_the_fly_image_manipulations_secured_with_signed_urls#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1647045693\/26_secure_img_transformations\/26_secure_img_transformations.jpg?_i=AA","datePublished":"2020-02-02T10:35:00+00:00","dateModified":"2025-10-29T19:41:01+00:00","description":"Learn how to secure images with a signed URL to prevent arbitrary access or modification of images using Cloudinary for free.","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/on_the_fly_image_manipulations_secured_with_signed_urls#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/on_the_fly_image_manipulations_secured_with_signed_urls"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/on_the_fly_image_manipulations_secured_with_signed_urls#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1647045693\/26_secure_img_transformations\/26_secure_img_transformations.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1647045693\/26_secure_img_transformations\/26_secure_img_transformations.jpg?_i=AA","width":2000,"height":1100,"caption":"Image showing graphic representation of Cloudinary secure URL capability"},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/on_the_fly_image_manipulations_secured_with_signed_urls#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Secure Image Transformations With a Signed Image URL"}]},{"@type":"WebSite","@id":"https:\/\/cloudinary.com\/blog\/#website","url":"https:\/\/cloudinary.com\/blog\/","name":"Cloudinary Blog","description":"","publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cloudinary.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/cloudinary.com\/blog\/#organization","name":"Cloudinary Blog","url":"https:\/\/cloudinary.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","width":312,"height":60,"caption":"Cloudinary Blog"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":""}]}},"jetpack_featured_media_url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1647045693\/26_secure_img_transformations\/26_secure_img_transformations.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21214","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/users\/41"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/comments?post=21214"}],"version-history":[{"count":7,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21214\/revisions"}],"predecessor-version":[{"id":39022,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21214\/revisions\/39022"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/23338"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=21214"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=21214"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=21214"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}