{"id":3383,"date":"2016-02-03T20:23:45","date_gmt":"2016-02-03T11:23:45","guid":{"rendered":"https:\/\/jirak.net\/wp\/aws-api-%ed%98%b8%ec%b6%9c-%ed%95%98%ea%b8%b0-2-amazon-s3-%ea%b0%9d%ec%b2%b4%ec%97%90-%eb%8c%80%ed%95%9c-%eb%af%b8%eb%a6%ac-%ec%84%a0%ec%96%b8%eb%90%9cpre-signed-url-%ec%83%9d%ec%84%b1\/"},"modified":"2016-02-03T20:23:45","modified_gmt":"2016-02-03T11:23:45","slug":"aws-api-%ed%98%b8%ec%b6%9c-%ed%95%98%ea%b8%b0-2-amazon-s3-%ea%b0%9d%ec%b2%b4%ec%97%90-%eb%8c%80%ed%95%9c-%eb%af%b8%eb%a6%ac-%ec%84%a0%ec%96%b8%eb%90%9cpre-signed-url-%ec%83%9d%ec%84%b1","status":"publish","type":"post","link":"https:\/\/jirak.net\/wp\/aws-api-%ed%98%b8%ec%b6%9c-%ed%95%98%ea%b8%b0-2-amazon-s3-%ea%b0%9d%ec%b2%b4%ec%97%90-%eb%8c%80%ed%95%9c-%eb%af%b8%eb%a6%ac-%ec%84%a0%ec%96%b8%eb%90%9cpre-signed-url-%ec%83%9d%ec%84%b1\/","title":{"rendered":"AWS API \ud638\ucd9c \ud558\uae30 (2) \u2013 Amazon S3 \uac1d\uccb4\uc5d0 \ub300\ud55c \ubbf8\ub9ac \uc120\uc5b8\ub41c(pre-signed) URL \uc0dd\uc131\ud558\uae30"},"content":{"rendered":"<p>\uc774\ubc88 \ube14\ub85c\uadf8 \ud3ec\uc2a4\ud305\uc740 \uc9c0\ub09c \ubc88\uc5d0 \uc62c\ub838\ub358 <a href=\"https:\/\/aws.amazon.com\/ko\/blogs\/korea\/aws-api-call-1\/\">AWS API \ud638\ucd9c\ud558\uae30(\uac1c\ub860\ud3b8)<\/a>\uc758 \ud6c4\uc18d\ud3b8\uc785\ub2c8\ub2e4. \uc544\ub9c8\ub3c4 \uac1c\ub860\ud3b8 \ube14\ub85c\uadf8\ub97c \ub05d\uae4c\uc9c0 \uc77d\uc73c\uc2dc\uace0\ub3c4 \uc560\ub9e4\ubaa8\ud638 \ud558\uc168\uc744 \uac83\uc73c\ub85c \uc0dd\uac01\ub429\ub2c8\ub2e4. \uc2e4\uc81c\ub85c HTTP\/HTTPS API \ud638\ucd9c \uc694\uccad\uc744 \ub9cc\ub4e4\uc5b4 \ubcf4\uba74\uc11c \uc804\uccb4\uc801\uc778 \ud750\ub984\uc744 \ud30c\uc545\ud558\uace0 \uc774\ud574\ub97c \ub3d5\ub3c4\ub85d \ud558\uaca0\uc2b5\ub2c8\ub2e4. &nbsp;<\/p>\n<p>\u2018\uc5b4\ub5a4 \uc608\uc81c\uac00 \uac04\ub2e8\ud558\uba74\uc11c\ub3c4 \uc2e4\uc81c \uc5c5\ubb34\uc5d0 \ub3c4\uc6c0\uc774 \ub420 \uc218 \uc788\uc744\uae4c?\u2019 \ub9ce\uc774 \uace0\ubbfc\ud558\uc600\ub294\ub370\uc694. \uc81c\ubaa9\uc5d0\uc11c \ucd94\uce21\ud558\uc168\uaca0\uc9c0\ub9cc, Amazon S3 \ubc84\ud0b7\uc5d0 \uc788\ub294 \uac1d\uccb4\ub97c \ud2b9\uc815 \uc2dc\uac04 \ub0b4\uc5d0\ub9cc \uc720\ud6a8\ud558\uac8c \uacf5\uc720\ud560 \uc218 \uc788\ub294 \ubbf8\ub9ac \uc120\uc5b8\ub41c(pre-signed) URL\uc744 \ub9cc\ub4e4\uc5b4 \ubcf4\ub3c4\ub85d \ud558\uaca0\uc2b5\ub2c8\ub2e4. \ubb3c\ub860 <a href=\"http:\/\/docs.aws.amazon.com\/ko_kr\/AmazonS3\/latest\/dev\/PresignedUrlUploadObject.html\">\uc774\uacf3<\/a>\uc744 \ucc38\uc870\ud574\uc11c, Java, .NET \uadf8\ub9ac\uace0 Ruby\uc6a9 SDK\ub97c \uc774\uc6a9\ud574 \ubbf8\ub9ac \uc120\uc5b8\ub41c URL\uc744 \uc27d\uac8c \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub610\ud55c AWS Explorer\ub098 \uae30\ud0c0 \uc0c1\uc6a9 \ub3c4\uad6c\uc5d0\uc11c\ub3c4 \uc774\ub7f0 \uae30\ub2a5\uc744 \uc774\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc774\ubc88 \ube14\ub85c\uadf8 \ud3ec\uc2a4\ud305\uc5d0\uc11c\ub294 bash \uc258 \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc774\uc6a9\ud574\uc11c \uc774 \uae30\ub2a5\uc744 \uc9c0\uc6d0\ud558\ub294 HTTP\/HTTPS API \ud638\ucd9c \uc694\uccad\uc744 \uc9c1\uc811 \ub9cc\ub4e4\uc5b4 \ubcf4\ub3c4\ub85d \ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc608\uc81c \uc258 \uc2a4\ud06c\ub9bd\ud2b8\ub294 \ubbf8\ub9ac \uc120\uc5b8\ub41c URL\uc744 \ub9cc\ub4dc\ub294\ub370 \uc11c\uba85 \ubc84\uc804 4\ub97c \uc0ac\uc6a9\ud558\uc600\uc2b5\ub2c8\ub2e4. Amazon S3 \uacbd\uc6b0 2014\ub144 1\uc6d4 30\uc77c \uc774\ud6c4\uc5d0 \uc0dd\uc131\ub41c \ub9ac\uc804\uc5d0\uc11c\ub294 \uc11c\uba85 \ubc84\uc804 V2\ub294 \ub354 \uc774\uc0c1 \uc9c0\uc6d0\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \ub530\ub77c\uc11c 2016\ub144 1\uc6d4 7\uc77c \uac1c\uc124\ub41c \uc11c\uc6b8 \ub9ac\uc804\ub3c4 \uc11c\uba85 \ubc84\uc804 V4 \ub9cc \uc9c0\uc6d0\ud569\ub2c8\ub2e4.<\/p>\n<p><strong><u>1. \uc0ac\uc804 \uc900\ube44 \uc0ac\ud56d<\/u><\/strong><br \/> \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc791\uc131\ud558\uae30 \uc704\ud574\uc11c\ub294 openssl(1) \ubc84\uc804 1 \ub610\ub294 \uadf8 \uc774\uc0c1\uc774 \ud544\uc694\ud569\ub2c8\ub2e4. \uc11c\uba85\ud0a4\ub97c \ub9cc\ub4e4 \ub54c \ud0a4\uac12\uc774 \ubb38\uc790\uc5f4\uc774 \uc544\ub2cc \uc774\uc9c4\ud0a4\uac12\uc744 \uc785\ub825\uc73c\ub85c \ubc1b\uc544\uc57c \ud558\uae30 \ub54c\ubb38\uc5d0 \ubc84\uc804 1 \uc774\uc0c1\uc774 \ud544\uc694\ud569\ub2c8\ub2e4. \ubc84\uc804 \ud655\uc778\uc740 \uc544\ub798\uc640 \uac19\uc774 \ud558\uc2dc\uace0, \uc608\uc81c\uc640 \uac19\uc774 0.9.8zg \ubc84\uc804\uc774\uba74 <a href=\"https:\/\/www.openssl.org\/source\/\">\uc774\uacf3<\/a>\uc5d0\uc11c \uc18c\uc2a4 \ucf54\ub4dc\ub97c \ubc1b\uc544 \uc124\uce58\ud558\uc2dc\uba74 \ub429\ub2c8\ub2e4. \uc124\uce58 \ubc29\ubc95\uc740 \uc774 \ube14\ub85c\uadf8 \ubc94\uc704\ub97c \ubc97\uc5b4\ub098\uae30 \ub54c\ubb38\uc5d0 \ub530\ub85c \uc124\uba85\ub4dc\ub9ac\uc9c0\ub294 \uc54a\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\" language-bash\"><code class=\" language-bash\">$ openssl version\nOpenSSL 0.9.8zg 14 July 2015<\/code><\/pre>\n<p>\uadf8\ub9ac\uace0 \uc0ac\uc6a9\uc790 \uc2e0\uc6d0 \uc815\ubcf4\uc640 \ub9ac\uc804 \uc815\ubcf4\ub97c \uc5bb\uae30 \uc704\ud574\uc11c \ud658\uacbd \ubcc0\uc218 AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY \ubc0f AWS_DEFAULT_REGION \uc744 \uc774\uc6a9\ud558\uc600\uc2b5\ub2c8\ub2e4. \uc124\uc815 \ubc29\ubc95\uc740 <a href=\"http:\/\/docs.aws.amazon.com\/ko_kr\/cli\/latest\/userguide\/cli-chap-getting-started.html\">\uc774\uacf3<\/a>\uc774\ub098 \uc544\ub798\ub97c \ucc38\uc870\ud558\uc2dc\uba74 \ub429\ub2c8\ub2e4. AWS \uacc4\uc815\uc5d0 \ub300\ud55c \uc911\uc694\ud55c \uc2e0\uc6d0 \uc815\ubcf4\ub97c \uc2a4\ud06c\ub9bd\ud2b8 \ucf54\ub4dc \ub0b4\uc5d0 \ud3ec\ud568\uc2dc\ud0a4\ub294 \uac83\uc740 \uc704\ud5d8\ud569\ub2c8\ub2e4. \ub530\ub77c\uc11c \uc0ac\uc6a9 \ud658\uacbd\uc5d0 \uc124\uc815\ud558\ub294 \uac83\uc744 \uad8c\uc7a5\ud569\ub2c8\ub2e4.<\/p>\n<pre class=\" language-bash\"><code class=\" language-bash\">$ export AWS_ACCESS_KEY_ID=&lt;YOUR_ACCESS_KEY_ID&gt;\n$ export AWS_SECRET_ACCESS_KEY=&lt;YOUR_SECRET_ACCESS_KEY_ID&gt;\n$ export AWS_DEFAULT_REGION=&lt;AWS_REGION&gt;<\/code><\/pre>\n<p>\ub85c\ucf00\uc77c \uc5b8\uc5b4 \uc124\uc815\uc740 UTF-8\uc778\ucf54\ub529\uc73c\ub85c \uc124\uc815\ud569\ub2c8\ub2e4. \uc774 \ub85c\ucf00\uc77c \uc124\uc815\uc774 \uc5ec\ub7ec\ubd84\uc758 \uc791\uc5c5 \ud658\uacbd\uacfc \ub2e4\ub974\ub2e4\uba74 bash \uc258 \uc2a4\ud06c\ub9bd\ud2b8 \ub0b4\uc5d0 \ud3ec\ud568\uc2dc\ucf1c\ub3c4 \ubb34\ubc29\ud569\ub2c8\ub2e4.<\/p>\n<pre class=\" language-bash\"><code class=\" language-bash\">$ export&nbsp; export LC_ALL=ko_kr.UTF-8\n$ export LANG=ko_kr.UTF-8<\/code><\/pre>\n<p><strong><u>2. \uc2a4\ud06c\ub9bd\ud2b8 \uc791\uc131\ud558\uae30<\/u><\/strong><br \/> \uc704 \uc120\ud589 \uc791\uc5c5\uc774 \uc644\ub8cc\ub418\uc5c8\ub2e4\uba74, \uc774\uc81c \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc791\uc131\ud560 \uc900\ube44\uac00 \ub418\uc5c8\uc2b5\ub2c8\ub2e4. &nbsp;Amazon S3 API \ud638\ucd9c \uc694\uccad\uc740 <a href=\"http:\/\/docs.aws.amazon.com\/ko_kr\/AmazonS3\/latest\/API\/sig-v4-authenticating-requests.html\">Amazon S3 API Reference<\/a>\ub97c \uae30\ubcf8\uc801\uc73c\ub85c \ucc38\uc870\ud558\uc600\uc73c\uba70, \ubbf8\ub9ac \uc120\uc5b8\ub41c URL\uc744 \ub9cc\ub4e4\uae30 \uc704\ud55c \uc804\ubc18\uc801\uc778 \uc791\uc5c5 \uc21c\uc11c\ub294 \uc544\ub798\uc640 \uac19\uc2b5\ub2c8\ub2e4:<\/p>\n<ol>\n<li>\ud45c\uc900 \uc694\uccad(Canonical Request) \ud615\uc2dd\uc73c\ub85c \uba54\uc2dc\uc9c0 \ub0b4\uc6a9\ub4e4\uc744 \uc815\ub82c\ud558\uae30<\/li>\n<li>\uc11c\uba85\ud558\uae30 \uc704\ud55c \ubb38\uc790\uc5f4(String To Sign) \ub9cc\ub4e4\uae30<\/li>\n<li>AWS \uc11c\uba85 \ubc84\uc804 4(Signature) \uacc4\uc0b0\ud558\uae30<\/li>\n<li>\uc0dd\uc131\ud55c \uc11c\uba85 \uc815\ubcf4\ub97c HTTP\/HTTPS API \uc694\uccad\uc5d0 \ucd94\uac00\ud558\uae30<\/li>\n<\/ol>\n<p>\uc704 \uc11c\uba85 \uacc4\uc0b0 \uc808\ucc28\ub97c \uad6c\uccb4\uc801\uc774\uace0 \uc774\ud574\ud558\uae30 \uc27d\uac8c \ub3c4\uc2dd\ud654\ud574 \ub193\uc740 \uac83\uc774 \uc544\ub798 \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc774\uba70, \uc774 \uc21c\uc11c\ub97c \ub530\ub77c\uc11c \uc2a4\ud06c\ub9bd\uc2a4\ud2c0 \uc791\uc131\ud558\uc600\uc2b5\ub2c8\ub2e4. \uadf8\ub9ac\uace0 \uac01 \ud56d\ubaa9\uc5d0\ub300\ud55c \uad6c\uccb4\uc801\uc778 \uc124\uba85\uc740 <a href=\"http:\/\/docs.aws.amazon.com\/ko_kr\/AmazonS3\/latest\/API\/sig-v4-header-based-auth.html\">\uc774\uacf3<\/a>\uc744 \ucc38\uc870\ud558\uc2dc\uba74 \ub9ce\uc740 \ub3c4\uc6c0\uc744 \uc5bb\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/awsblogskr.s3-ap-northeast-2.amazonaws.com\/articles\/2016-01-aws-api-cheolsoo\/image003.png\" alt=\"\" \/><\/p>\n<p>\uc544\ub798\ub294 \uc704 \uc808\ucc28\uc5d0 \ub530\ub77c \uc0dd\uc131\ub41c \ubbf8\ub9ac \uc120\uc5b8\ub41c URL\uc758 \ud55c \uc608\uc785\ub2c8\ub2e4. \uac00\ub3c5\uc131\uc744 \ub192\uc774\uae30 \uc704\ud574 URL\uc5d0 \uc904\ubc14\uafc8 \ubb38\uc790\ub97c \ucd94\uac00\ud588\uc2b5\ub2c8\ub2e4. \uc2e4\uc81c\ub85c\ub294 \ud55c \uc904\ub85c \ud45c\ud604\ub418\uc5b4\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<pre class=\" language-http\"><code class=\" language-http\">https:\/\/examplebucket.s3.amazonaws.com \/test.txt?\nX-Amz-Algorithm=AWS4-HMAC-SHA256\n&amp;X-Amz-Credential=<em>&lt;YOUR_ACCESS_KEY_ID&gt;<\/em>\/20160115\/ap-northeast-2\/s3\/aws4_request&amp;\n&amp;X-Amz-Date=20160115T000000Z\n&amp;X-Amz-Expires=86400\n&amp;X-Amz-SignedHeaders=host\n&amp;X-Amz-Signature=<em>&lt;SIGNATURE_VALUE&gt;<\/em><\/code><\/pre>\n<p>\uadf8\ub9ac\uace0 URL\uc5d0\uc11c X-Amz-Credential \ud5e4\ub354\uc758 \uac12\ub3c4 \uac00\ub3c5\uc131\uc744 \uc704\ud574\uc11c \u201c\/\u201d\ubb38\uc790\ub97c \uc0ac\uc6a9\ud574\uc11c \ud45c\ud604\ud558\uc600\uc2b5\ub2c8\ub2e4. \uc2e4\uc81c\ub85c\ub294 %2F\ub85c \uc778\ucf54\ub529\ub418\uc5b4\uc11c \uc544\ub798\uc640 \uac19\uc774 \uc0ac\uc6a9\ub418\uc5b4\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<pre class=\" language-http\"><code class=\" language-http\">&amp;X-Amz-Credential=<em>&lt;YOUR_ACCESS_KEY_ID&gt;<\/em>%2F20160115%2Fap-northeast-2%2Fs3%2Faws4_request<\/code><\/pre>\n<p>URL\ub0b4\uc5d0 \uc778\uc99d \uc815\ubcf4\ub97c \uc81c\uacf5\ud558\uae30 \uc704\ud574, \ub2e4\uc74c\uacfc \uac19\uc740 \ub2e4\uc591\ud55c \ucffc\ub9ac \ub9e4\uac1c\ubcc0\uc218\ub4e4\uc774 \ud3ec\ud568\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<table border=\"1\">\n<tbody>\n<tr>\n<td width=\"143\">\ub9e4\uac1c\ubcc0\uc218<\/td>\n<td width=\"307\">\uc124\uba85<\/td>\n<\/tr>\n<tr>\n<td width=\"143\">X-Amz-Algorithm<\/td>\n<td width=\"307\">\uc11c\uba85 \ubc84\uc804\uacfc \uc54c\uace0\ub9ac\uc998\uc744 \uc2dd\ubcc4\ud558\uace0, \uc11c\uba85\uc744 \uacc4\uc0b0\ud558\ub294\ub370 \uc0ac\uc6a9. \uc11c\uba85 \ubc84\uc804 4\ub97c \uc704\ud574\uc11c \u201cAWS4-HMAC-SHA256\u201d \ub85c \uc124\uc815<\/td>\n<\/tr>\n<tr>\n<td width=\"143\">X-Amz-Credential<\/td>\n<td width=\"307\">\uc561\uc138\uc2a4 \ud0a4 ID\uc640 \ubc94\uc704 \uc815\ubcf4(\uc694\uccad \ub0a0\uc9dc, \uc0ac\uc6a9\ud558\ub294 \ub9ac\uc804, \uc11c\ube44\uc2a4 \uba85). \ub9ac\uc804 \uba85\uc740 <a href=\"http:\/\/docs.aws.amazon.com\/ko_kr\/general\/latest\/gr\/rande.html\">\ub9ac\uc804 \ubc0f \uc5d4\ub4dc\ud3ec\uc778\ud2b8<\/a>\uc5d0\uc11c \ud655\uc778 \uac00\ub2a5<\/td>\n<\/tr>\n<tr>\n<td width=\"143\">X-Amz-Date<\/td>\n<td width=\"307\">\ub0a0\uc9dc\ub294 ISO 8601\ud615\uc2dd. \uc608: 20160115T000000Z<\/td>\n<\/tr>\n<tr>\n<td width=\"143\">X-Amz-Expires<\/td>\n<td width=\"307\">\ubbf8\ub9ac \uc120\uc5b8\ub41c URL\uc774 \uc720\ud6a8\ud55c \uc2dc\uac04 \uc8fc\uae30. \ucd08\ub2e8\uc704. \uc815\uc218 \uac12. \ucd5c\uc18c 1\uc5d0\uc11c \ucd5c\ub300 604800 (7\uc77c) \uc608: 86400 (24\uc2dc\uac04)<\/td>\n<\/tr>\n<tr>\n<td width=\"143\">X-Amz-SignedHeaders<\/td>\n<td width=\"307\">\uc11c\uba85\uc744 \uacc4\uc0b0\ud558\uae30 \uc704\ud574 \uc0ac\uc6a9\ub418\uc5b4\uc9c0\ub294 \ud5e4\ub354 \ubaa9\ub85d. HTTP <em>host<\/em> \ud5e4\ub354\uac00 \uc694\uad6c\ub428<\/td>\n<\/tr>\n<tr>\n<td width=\"143\">X-Amz-Signature<\/td>\n<td width=\"307\">\uc694\uccad\uc744 \uc778\uc99d\ud558\uae30 \uc704\ud55c \uc11c\uba85<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><em>\uc8fc\uc758: X-Amz-Signature \ud5e4\ub354\ub97c \uc81c\uc678\ud55c \ubaa8\ub4e0 \ucffc\ub9ac \ub9e4\uac1c\ubcc0\uc218\ub4e4\uc740 \ud45c\uc900 \ucffc\ub9ac \ubb38\uc790\uc5f4(Canonical Query String)\uc5d0 \ud3ec\ud568\uc2dc\ud0b5\ub2c8\ub2e4. \ud45c\uc900 \ud5e4\ub354(Canonical Headers)\ub294 HTTP <em>host<\/em> \ud5e4\ub354\ub97c \ud3ec\ud568\ud574\uc57c \ud569\ub2c8\ub2e4. \ubbf8\ub9ac \uc0ac\uc778\ub41c URL\uc744 \ub9cc\ub4e4 \ub54c \uc2e4\uc81c \ud398\uc774\ub85c\ub4dc\uc5d0 \ub300\ud574 \uc54c \uc218 \uc5c6\uae30 \ub54c\ubb38\uc5d0 \ud45c\uc900 \uc694\uccad(Canonical Request)\uc5d0 \uc788\ub294 \ud398\uc774\ub85c\ub4dc \ud574\uc2dc\ub294 \ud3ec\ud568 \uc548 \uc2dc\ud0b5\ub2c8\ub2e4. \ub300\uc2e0 \u201cUNSIGNED-PAYLOAD\u201d \ubb38\uc790\uc5f4\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<\/em><\/p>\n<p>\uc774\ub97c \ubc14\ud0d5\uc73c\ub85c \ub9cc\ub4e0 \uc644\uc131\ub41c \uc2a4\ud06c\ub9bd\ud2b8\ub294 \uc544\ub798\uc640 \uac19\uc2b5\ub2c8\ub2e4. Bash \uc258 \uc2a4\ud06c\ub9bd\ud2b8\uc5d0 \ub300\ud55c \ube14\ub85c\uadf8 \ud3ec\uc2a4\ud305\uc774 \uc544\ub2c8\uae30 \ub54c\ubb38\uc5d0 bash \uc258 \ubb38\uad6c\uc5d0 \ub300\ud574\uc11c\ub294 \ub530\ub85c \uc124\uba85\ud558\uc9c0 \uc54a\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\" language-bash\"><code class=\" language-bash\">#!\/bin\/bash\n#\nexport PATH=&quot;\/usr\/local\/ssl\/bin:$PATH&quot;\nurlEncode() {\n  LINE=&quot;$1&quot;\n  LENGTH=&quot;${#LINE}&quot;\n  I=0\n  while [ $I -lt $LENGTH ]\n    do\n    C=&quot;${LINE:I:1}&quot;\n  case $C in\n    [a-zA-Z0-9.~_-]) printf &quot;$C&quot; ;;\n    *) printf '%%%02X' &quot;'$C&quot; ;;\n  esac\n    let I=I+1\n  done\n}\n\ngetHexaDecimalString() {\n  read LINE\n  LENGTH=&quot;${#LINE}&quot;\n  I=0\n  while [ $I -lt $LENGTH ]\n    do\n    C=&quot;${LINE:I:1}&quot;\n   printf '%2x' &quot;'$C&quot;\n   let I=I+1\n  done\n}\n\ngetSignatureKey() {\n  SECRET_KEY=$1\n  DATESTAMP=$2\n  REGIONNAME=$3\n  SERVICENAME=$4\n  STRING_TO_SIGN=$5\n\n  HEX_KEY=$(echo -n &quot;AWS4${SECRET_KEY}&quot; | getHexaDecimalString)\n  HEX_KEY=$(echo -n &quot;${DATESTAMP}&quot; | openssl dgst -sha256 -mac HMAC -macopt hexkey:${HEX_KEY})\n  HEX_KEY=$(echo -n &quot;${REGIONNAME}&quot; | openssl dgst -sha256 -mac HMAC -macopt hexkey:${HEX_KEY#* })\n  HEX_KEY=$(echo -n &quot;${SERVICENAME}&quot; | openssl dgst -sha256 -mac HMAC -macopt hexkey:${HEX_KEY#* })\n  SIGNING_KEY=$(echo -n &quot;aws4_request&quot; | openssl dgst -sha256 -mac HMAC -macopt hexkey:${HEX_KEY#* })\n\n  SIGNATURE=$(echo -en &quot;${STRING_TO_SIGN}&quot; | openssl dgst -binary -hex -sha256 -mac HMAC -macopt hexkey:${SIGNING_KEY#* })\n  echo &quot;${SIGNATURE#* }&quot;\n} \n\ngetHexaHash() {\n  PAYLOAD=&quot;$@&quot;\n  HASH=$(echo -n &quot;${PAYLOAD}&quot; | openssl dgst -sha256)\n  echo&nbsp; &quot;${HASH#* }&quot;\n}\n\n### Main ###\nif [ -z $AWS_DEFAULT_REGION ] || [ -z $AWS_SECRET_ACCESS_KEY ] || [ -z $AWS_ACCESS_KEY_ID ]\nthen\n  echo &quot;Please set $AWS_DEFAULT_REGION, $AWS_SECRET_ACCESS_KEY, and $AWS_ACCESS_KEY_ID environment variables&quot;\nexit 1\nfi\nSK=&quot;$AWS_SECRET_ACCESS_KEY&quot;\nAK=&quot;$AWS_ACCESS_KEY_ID&quot;\nREGION=&quot;$AWS_DEFAULT_REGION&quot;\n\n[ $# -ne 6 ] &amp;&amp; exit 2\n \nwhile getopts &quot;:b:k:e:&quot; OPT; do\n  case $OPT in\n        b)\n         BUCKET=$OPTARG\n         ;;\n        k)\n         S3KEY=$OPTARG\n         ;;\n        e)\n         EXPIRES=$OPTARG\n         ;;\n       *)\n   echo &quot;Invalid option: -$OPTARG&quot; &gt;&amp;2\n   exit 3\n   ;;\n   esac\ndone\n\nSERVICENAME=&quot;s3&quot;\nHOST=&quot;${BUCKET}.${SERVICENAME}.amazonaws.com&quot;\nENDPOINT=&quot;http:\/\/${BUCKET}.${SERVICENAME}.amazonaws.com&quot;\n\n# step 1. Create a Canonical request\nAMZ_DATE=$(date -u +%Y%m%dT%H%M%SZ)\nDATESTAMP=$(date -u +%Y%m%d)\nAMZ_EXPIRES=$((${EXPIRES}*60))&nbsp;&nbsp; # minute -&gt; second\n\nHTTPMETHOD=&quot;GET&quot;\nCANONICAL_URI=&quot;\/${S3KEY}&quot;\n#\nCANONICAL_HEADERS=&quot;host:${HOST}n&quot;\nSIGNED_HEADERS=&quot;host&quot;\nPAYLOAD_HASH=&quot;UNSIGNED-PAYLOAD&quot;\n#\nALGORITHM=&quot;AWS4-HMAC-SHA256&quot;\nCREDENTIAL_SCOPE=&quot;${DATESTAMP}\/${REGION}\/${SERVICENAME}\/aws4_request&quot;\n#\nCANONICAL_QUERYSTRING=&quot;X-Amz-Algorithm=${ALGORITHM}&quot;\nCANONICAL_QUERYSTRING=&quot;${CANONICAL_QUERYSTRING}&amp;X-Amz-Credential=$(urlEncode &quot;${AK}\/${CREDENTIAL_SCOPE}&quot;)&quot;\nCANONICAL_QUERYSTRING=&quot;${CANONICAL_QUERYSTRING}&amp;X-Amz-Date=${AMZ_DATE}&quot;\nCANONICAL_QUERYSTRING=&quot;${CANONICAL_QUERYSTRING}&amp;X-Amz-Expires=${AMZ_EXPIRES}&quot;\nCANONICAL_QUERYSTRING=&quot;${CANONICAL_QUERYSTRING}&amp;X-Amz-SignedHeaders=${SIGNED_HEADERS}&quot;\nCANONICAL_REQUEST=&quot;${HTTPMETHOD}n${CANONICAL_URI}n${CANONICAL_QUERYSTRING}n${CANONICAL_HEADERS}n${SIGNED_HEADERS}n${PAYLOAD_HASH}&quot;\n\n# step 2. String To Sign\nSTRING_TO_SIGN=&quot;${ALGORITHM}n${AMZ_DATE}n${CREDENTIAL_SCOPE}n$(getHexaHash &quot;$(echo -e &quot;${CANONICAL_REQUEST}&quot;)&quot;)&quot;\n\n# step 3. Signature\nSIGNATURE=&quot;$(getSignatureKey $SK $DATESTAMP $REGION $SERVICENAME $STRING_TO_SIGN)&quot;\n\n# step 4.&nbsp; Create a request URL\nCANONICAL_QUERYSTRING=&quot;${CANONICAL_QUERYSTRING}&amp;X-Amz-Signature=${SIGNATURE}&quot;\n\necho &quot;request_url = ${ENDPOINT}\/${S3KEY}?${CANONICAL_QUERYSTRING}&quot;<\/code><\/pre>\n<p>\uc2a4\ud06c\ub9bd\ud2b8\uc758 \uac04\uacb0\uc131\uc744 \uc720\uc9c0\ud558\uae30 \uc704\ud574\uc11c \ub300\ubd80\ubd84\uc758 \uc5d0\ub7ec \ucc98\ub9ac \ub8e8\ud2f4\uc744 \ubc30\uc81c\ud558\uc600\uc2b5\ub2c8\ub2e4. \ub530\ub77c\uc11c \ubc94\uc6a9\uc801\uc73c\ub85c \uc0ac\uc6a9\ud558\uae30 \uc704\ud574\uc11c\ub294 \uc801\uc808\ud55c \uc5d0\ub7ec \ucc98\ub9ac \ub8e8\ud2f4\ub4e4\uc774 \ucd94\uac00\ub418\uc5b4\uc57c \ud558\uace0 \ucda9\ubd84\ud55c \ud14c\uc2a4\ud2b8\ub97c \uac70\uce5c \ud6c4 \uc0ac\uc6a9\ud558\uc2dc\uae38 \uad8c\uc7a5\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc544\ub798\ub294 \uc774 \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc774\uc6a9\ud574\uc11c \ud55c \uc2dc\uac04\ub3d9\uc548\ub9cc \ubc84\ud0b7 examplebucket\uc5d0 \ud3ec\ud568\ub41c \uc624\ube0c\uc81d\ud2b8test.txt\ub97c \ub2e4\ub978 \uc0ac\ub78c\uc5d0\uac8c \uacf5\uc720\ud558\uae30 \uc704\ud574 \ubbf8\ub9ac \uc0ac\uc778\ub41c URL\uc744 \ub9cc\ub4e0 \uc608\uc785\ub2c8\ub2e4.<\/p>\n<pre class=\" language-bash\"><code class=\" language-bash\">$ .\/apis3.sh -b examplebucket -k test.txt -e 60\nrequest_url = http:\/\/examplebucket.s3.amazonaws.com\/test.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=&lt;YOUR_ACCESS_KEY_ID&gt;%2F20160115%2Fap-northeast-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20160115T130732Z&amp;X-Amz-Expires=3600&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Signature=d0578b9fe721c9964765f2ab6bf6f8a1fc7c4966956785688b881783b661bdfd<\/code><\/pre>\n<p>\uc774 URL\uc740 \uc0dd\uc131\ub41c \uc2dc\uac04\ubd80\ud130 60\ubd84\uac04 \uc720\ud6a8\ud558\uba70, \uacf5\uc720\ud558\uace0 \uc2f6\uc740 \uc784\uc758\uc758 \uc0ac\ub78c\uc5d0\uac8c \uc804\ub2ec\ud558\uba74 \ub429\ub2c8\ub2e4. \uadf8\ub9ac\uace0 \uacf5\uc720\ub41c \ub9c1\ud06c\ub97c \ud074\ub9ad\ud558\uac70\ub098 curl(1) \uba85\ub839\uc5b4\ub85c \uc2e4\ud589\ud558\uac8c \ub418\uba74, &nbsp;\ud574\ub2f9 API \ud638\ucd9c \uc694\uccad\uc774Amazon S3 \uc5d4\ub4dc\ud3ec\uc778\ud2b8\ub85c \uc804\ub2ec\ub418\uace0 \uc801\uc808\ud788 \ucc98\ub9ac\ub429\ub2c8\ub2e4.<\/p>\n<p>\uc544\ub798\ub294 curl(1) \ub97c \uc774\uc6a9\ud574\uc11c \uc624\ube0c\uc81d\ud2b8\ub97c \uc131\uacf5\uc801\uc73c\ub85c \ub2e4\uc6b4\ub85c\ub4dc\ud55c \uc608\uc785\ub2c8\ub2e4.<\/p>\n<pre class=\" language-bash\"><code class=\" language-bash\">$ curl -o &quot;test.txt&quot; &quot;http:\/\/examplebucket.s3.amazonaws.com\/test.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=&lt;YOUR_ACCESS_KEY_ID&gt;%2F20160115%2Fap-northeast-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20160115T130732Z&amp;X-Amz-Expires=3600&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Signature=d0578b9fe721c9964765f2ab6bf6f8a1fc7c4966956785688b881783b661bdfd&quot;\n% Total&nbsp;&nbsp;&nbsp; % Received % Xferd&nbsp; Average Speed&nbsp;&nbsp; Time&nbsp;&nbsp;&nbsp; Time&nbsp;&nbsp;&nbsp;&nbsp; Time&nbsp; Current\nDload&nbsp; Upload&nbsp;&nbsp; Total&nbsp;&nbsp; Spent&nbsp;&nbsp;&nbsp; Left&nbsp; Speed\n100&nbsp; 3619&nbsp; 100&nbsp; 3619&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp; 6305&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 --:--:-- --:--:-- --:--:--&nbsp; 6304<\/code><\/pre>\n<p>\uadf8\ub9ac\uace0 \uc544\ub798\ub294 \uc2dc\uac04\uc774 \ucd08\uacfc\ub418\uc5b4 \ub2e4\uc6b4\ub85c\ub4dc\uac00 \uc2e4\ud328\ud55c \uc608\uc785\ub2c8\ub2e4.<\/p>\n<pre class=\" language-bash\"><code class=\" language-bash\">$ curl -o &quot;test.txt&quot; &quot;http:\/\/examplebucket.s3.amazonaws.com\/test.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=&lt;YOUR_ACCESS_KEY_ID&gt;%2F20160115%2Fap-northeast-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20160115T130732Z&amp;X-Amz-Expires=3600&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Signature=d0578b9fe721c9964765f2ab6bf6f8a1fc7c4966956785688b881783b661bdfd&quot;\n&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;\n&lt;Error&gt;&lt;Code&gt;AccessDenied&lt;\/Code&gt;&lt;Message&gt;Request has expired&lt;\/Message&gt;&lt;X-Amz-Expires&gt;60&lt;\/X-Amz-Expires&gt;&lt;Expires&gt;2016-01-15T140732:52Z&lt;\/Expires&gt;&lt;ServerTime&gt;2016-01-18T20:13:55Z&lt;\/ServerTime&gt;&lt;RequestId&gt;F865CB514FF4C92A&lt;\/RequestId&gt;&lt;HostId&gt;f6Bv6Jtht91bSqt8OPsxirsrHZkWs7Qcc4kNYjZ2tJbPUmt8BW9Wv1hAUY2YFDKqSpEvFr8PLbI=&lt;\/HostId&gt;&lt;\/Error&gt;<\/code><\/pre>\n<p>\uc9c0\uae08\uae4c\uc9c0 \ucd1d 2\ud68c\uc758 \ud3ec\uc2a4\ud305\uc744 \ud1b5\ud574\uc11c AWS API \ud638\ucd9c \uc694\uccad\uc744 \uc5b4\ub5bb\uac8c \ub9cc\ub4e4 \uc218 \uc788\ub294\uc9c0 \uc0b4\ud3b4\ubcf4\uc558\uc2b5\ub2c8\ub2e4. \ud2b9\ud788 \uc2e4\uc804\ud3b8\uc5d0\uc11c \uc81c\uacf5\ub41c \uc608\ub294 \ub9ce\uc740 \uc0ac\uc6a9\uc790\ub4e4\uc774 \ubb38\uc758\ud558\uc2e0 \ub0b4\uc6a9\uc774\uae30\ub3c4 \ud569\ub2c8\ub2e4. \uc774\ubc88 \uae00\uc744 \ud1b5\ud574\uc11c \uc55e\uc73c\ub85cAWS API \ud638\ucd9c\uc744 \ud65c\uc6a9\ud558\uc2e4 \uc218 \uc788\uace0,&nbsp; S3 \uc624\ube0c\uc81d\ud2b8\ub97c \uc548\uc804\ud558\uac8c \uacf5\uc720\ud558\ub294\ub370 \uc870\uae08\uc774\ub77c\ub3c4 \ub3c4\uc6c0\uc774 \ub418\uc5c8\uc73c\uba74 \ud569\ub2c8\ub2e4.<br \/> <em>\ubcf8 \uae00\uc740 \uc544\ub9c8\uc874\uc6f9\uc11c\ube44\uc2a4 \ucf54\ub9ac\uc544\uc758 \uc194\ub8e8\uc158\uc988 \uc544\ud0a4\ud14d\ud2b8\uac00 \uad6d\ub0b4 \uace0\uac1d\uc744 \uc704\ud574 \uc804\ud574 \ub4dc\ub9ac\ub294 <a href=\"https:\/\/aws.amazon.com\/ko\/blogs\/korea\/category\/korea-techtips\/\">AWS \ud65c\uc6a9 \uae30\uc220 \ud301<\/a>\uc744 \ubcf4\ub0b4\ub4dc\ub9ac\ub294 \ucf54\ub108\ub85c\uc11c, \uc774\ubc88 \uae00\uc740 \ubc15\ucca0\uc218 \uc194\ub8e8\uc158\uc988 \uc544\ud0a4\ud14d\ud2b8\uaed8\uc11c \uc791\uc131\ud574\uc8fc\uc168\uc2b5\ub2c8\ub2e4.<\/em><br \/> <img decoding=\"async\" src=\"http:\/\/awsblogskr.s3-ap-northeast-2.amazonaws.com\/photo-cheolsoo.png\" alt=\"\" \/><\/p>\n<p>Source: aws-blog-korea<\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"mh-excerpt\"><p>\uc774\ubc88 \ube14\ub85c\uadf8 \ud3ec\uc2a4\ud305\uc740 \uc9c0\ub09c \ubc88\uc5d0 \uc62c\ub838\ub358 AWS API \ud638\ucd9c\ud558\uae30(\uac1c\ub860\ud3b8)\uc758 \ud6c4\uc18d\ud3b8\uc785\ub2c8\ub2e4. \uc544\ub9c8\ub3c4 \uac1c\ub860\ud3b8 \ube14\ub85c\uadf8\ub97c \ub05d\uae4c\uc9c0 \uc77d\uc73c\uc2dc\uace0\ub3c4 \uc560\ub9e4\ubaa8\ud638 \ud558\uc168\uc744 \uac83\uc73c\ub85c \uc0dd\uac01\ub429\ub2c8\ub2e4. \uc2e4\uc81c\ub85c HTTP\/HTTPS API \ud638\ucd9c \uc694\uccad\uc744 \ub9cc\ub4e4\uc5b4 \ubcf4\uba74\uc11c \uc804\uccb4\uc801\uc778 \ud750\ub984\uc744 \ud30c\uc545\ud558\uace0 \uc774\ud574\ub97c \ub3d5\ub3c4\ub85d \ud558\uaca0\uc2b5\ub2c8\ub2e4. &nbsp; \u2018\uc5b4\ub5a4 \uc608\uc81c\uac00 \uac04\ub2e8\ud558\uba74\uc11c\ub3c4 \uc2e4\uc81c \uc5c5\ubb34\uc5d0 \ub3c4\uc6c0\uc774 \ub420 \uc218 \uc788\uc744\uae4c?\u2019 \ub9ce\uc774 \uace0\ubbfc\ud558\uc600\ub294\ub370\uc694. \uc81c\ubaa9\uc5d0\uc11c \ucd94\uce21\ud558\uc168\uaca0\uc9c0\ub9cc, Amazon S3 \ubc84\ud0b7\uc5d0 \uc788\ub294 \uac1d\uccb4\ub97c \ud2b9\uc815 \uc2dc\uac04 \ub0b4\uc5d0\ub9cc \uc720\ud6a8\ud558\uac8c \uacf5\uc720\ud560 \uc218 \uc788\ub294 \ubbf8\ub9ac \uc120\uc5b8\ub41c(pre-signed) URL\uc744 \ub9cc\ub4e4\uc5b4 \ubcf4\ub3c4\ub85d \ud558\uaca0\uc2b5\ub2c8\ub2e4. \ubb3c\ub860 \uc774\uacf3\uc744 \ucc38\uc870\ud574\uc11c, Java, .NET \uadf8\ub9ac\uace0 Ruby\uc6a9 SDK\ub97c \uc774\uc6a9\ud574 \ubbf8\ub9ac \uc120\uc5b8\ub41c URL\uc744 \uc27d\uac8c \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub610\ud55c AWS Explorer\ub098 \uae30\ud0c0 \uc0c1\uc6a9 \ub3c4\uad6c\uc5d0\uc11c\ub3c4 \uc774\ub7f0 \uae30\ub2a5\uc744 \uc774\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ubc88 \ube14\ub85c\uadf8 \ud3ec\uc2a4\ud305\uc5d0\uc11c\ub294 bash \uc258 \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc774\uc6a9\ud574\uc11c \uc774 \uae30\ub2a5\uc744 \uc9c0\uc6d0\ud558\ub294 HTTP\/HTTPS API \ud638\ucd9c \uc694\uccad\uc744 \uc9c1\uc811 \ub9cc\ub4e4\uc5b4 \ubcf4\ub3c4\ub85d \ud558\uaca0\uc2b5\ub2c8\ub2e4. \uc608\uc81c \uc258 \uc2a4\ud06c\ub9bd\ud2b8\ub294 \ubbf8\ub9ac \uc120\uc5b8\ub41c URL\uc744 \ub9cc\ub4dc\ub294\ub370 \uc11c\uba85 \ubc84\uc804 4\ub97c \uc0ac\uc6a9\ud558\uc600\uc2b5\ub2c8\ub2e4. Amazon S3 \uacbd\uc6b0 2014\ub144 1\uc6d4 30\uc77c \uc774\ud6c4\uc5d0 \uc0dd\uc131\ub41c \ub9ac\uc804\uc5d0\uc11c\ub294 \uc11c\uba85 \ubc84\uc804 V2\ub294 \ub354 \uc774\uc0c1 \uc9c0\uc6d0\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \ub530\ub77c\uc11c 2016\ub144 1\uc6d4 7\uc77c <a class=\"mh-excerpt-more\" href=\"https:\/\/jirak.net\/wp\/aws-api-%ed%98%b8%ec%b6%9c-%ed%95%98%ea%b8%b0-2-amazon-s3-%ea%b0%9d%ec%b2%b4%ec%97%90-%eb%8c%80%ed%95%9c-%eb%af%b8%eb%a6%ac-%ec%84%a0%ec%96%b8%eb%90%9cpre-signed-url-%ec%83%9d%ec%84%b1\/\" title=\"AWS API \ud638\ucd9c \ud558\uae30 (2) \u2013 Amazon S3 \uac1d\uccb4\uc5d0 \ub300\ud55c \ubbf8\ub9ac \uc120\uc5b8\ub41c(pre-signed) URL \uc0dd\uc131\ud558\uae30\">[ more&#8230; ]<\/a><\/p>\n<\/div>","protected":false},"author":1,"featured_media":3384,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[169],"tags":[656],"class_list":["post-3383","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-news","tag-aws"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/posts\/3383","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/comments?post=3383"}],"version-history":[{"count":0,"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/posts\/3383\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/media\/3384"}],"wp:attachment":[{"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/media?parent=3383"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/categories?post=3383"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/tags?post=3383"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}