{"id":138021,"date":"2021-07-08T00:00:00","date_gmt":"2021-07-08T00:00:00","guid":{"rendered":"https:\/\/adapty.io\/blog\/storekit-2\/"},"modified":"2025-06-26T13:05:09","modified_gmt":"2025-06-26T13:05:09","slug":"storekit-2","status":"publish","type":"post","link":"https:\/\/adapty.io\/ko\/blog\/storekit-2\/","title":{"rendered":"StoreKit 2 API \uc758 \uc0c8\ub85c\uc6b4 \uae30\ub2a5\uacfc Apple\uc774 \uc778\uc571 \uad6c\ub9e4 \ud1b5\ud569 \uc744 \uac04\uc18c\ud654\ud55c \ubc29\ubc95"},"content":{"rendered":"

Apple\uc740\ucd5c\uadfc\uc5d0 \uc5f4\ub9b0 WWDC2021\uc5d0\uc11c\uc0c8\ub85c\uc6b4 \ubc84\uc804\uc758 StoreKit2\ub97c\uc120\ubcf4\uc600\uc2b5\ub2c8\ub2e4.iOS\uc5d0\uc11c\uad6c\ub9e4\ub97c \ub2f4\ub2f9\ud558\ub294 \ud504\ub808\uc784\uc6cc\ud06c\uc785\ub2c8\ub2e4.\uc778\uc571\uad6c\ub9e4 (in-apppurchase) \ubc0f\uad6c\ub3c5 (subscription)\uae30\ub2a5\uc774\uc788\ub294 \uc571 (app)\uc758\uc810\uc720\uc728\uc774 \uafb8\uc900\ud788 \uc99d\uac00\ud558\uace0 \uc788\uc73c\uba70,Apple\uc740StoreKit2\ub97c\ucd9c\uc2dc\ud558\uc5ec \uc778\uc571 \uad6c\ub9e4\ub97c \uc571\uc5d0 \ud1b5\ud569\ud558\ub294 \uac83\uc744 \ud06c\uac8c\uac04\uc18c\ud654\ud588\uc2b5\ub2c8\ub2e4.\uc624\ub298\uc6b0\ub9ac\ub294 \uc11c\ubc84 \uce21\uc5d0\uc11c StoreKit2\ub85c\uc791\uc5c5\ud558\ub294 \uac83 \uc989,App Store Server API\ub97c\uc0ac\uc6a9\ud558\ub294 \ubc95\uc744 \uc54c\uc544\ubcfc \uac83\uc785\ub2c8\ub2e4.<\/p>

\uc778\uc99d\uc694\uccad<\/h2>

\ud604\uc7acAPI \ubc84\uc804\uc5d0\uc11c\ub294\uc694\uccad\uc744 \ubcf4\ub0b4\uae30 \uc704\ud574 \uacf5\uc720 \uc554\ud638 (SharedSecret)\uac00\ud544\uc694\ud569\ub2c8\ub2e4.\uc774\uac83\uc740App StoreConnect\uc5d0\uc11c\uc5bb\uc744 \uc218 \uc788\ub294 \uace0\uc815 \uc554\ud638 \ubb38\uc790\uc5f4\uc785\ub2c8\ub2e4.API\uc758\uc0c8 \ubc84\uc804\uc740 \uc694\uccad \uc778\uc99d\uc744 \uc704\ud574 JSONWeb Token (JWT) \ud45c\uc900\uc744\uc0ac\uc6a9\ud569\ub2c8\ub2e4.  <\/p>

\ud0a4\uc0dd\uc131 <\/h3>

\uac00\uc7a5\uba3c\uc800,\uc694\uccad\uc744\uc2b9\uc778\ud558\ub294 \ub370 \uc0ac\uc6a9\ub418\ub294 \uac1c\uc778\ud0a4\ub97c \uc0dd\uc131<\/a>\ud569\ub2c8\ub2e4.App Store Connect\ub97c\uc5f4\uace0 Usersand Access \uc139\uc158\uc73c\ub85c\uc774\ub3d9\ud55c \ub2e4\uc74c Keys\ud0ed\uc73c\ub85c\uc774\ub3d9\ud569\ub2c8\ub2e4.\uc778\uc571\uad6c\ub9e4 \ud0a4 \uc720\ud615\uc744 \uc120\ud0dd\ud569\ub2c8\ub2e4.\uc0c8\ud0a4\ub97c \ub2e4\uc6b4\ub85c\ub4dc\ud569\ub2c8\ub2e4.\ub610\ud55cID\uac00\ud544\uc694\ud55c\ub370,App Store Connect API \ud0ed\uc5d0\uc11c\ucc3e\uc744 \uc218 \uc788\ub294 IssueID\uc640\ub3d9\uc77c\ud55c \ud398\uc774\uc9c0\uc5d0\uc11c \ubcf5\uc0ac\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>

\"Creating
AppStore Server API \uc791\uc5c5\uc744\uc704\ud55c \uac1c\uc778 \ud0a4 \uc0dd\uc131<\/em><\/figcaption><\/figure>

\ud1a0\ud070\uc0dd\uc131\ud558\uae30<\/h3>

\ub2e4\uc74c\ub2e8\uacc4\ub294 \uc694\uccad\uc744 \uc2b9\uc778\ud558\ub294 \ub370 \uc0ac\uc6a9\ud560 \ud1a0\ud070\uc744 \ub9cc\ub4dc\ub294\uac83\uc785\ub2c8\ub2e4.\uc774\uacfc\uc815\uc740 \ubb38\uc11c<\/a>\uc5d0\uc790\uc138\ud788 \uc124\uba85\ub418\uc5b4 \uc788\uc73c\ubbc0\ub85c,\ud06c\uac8c\uc2e0\uacbd\uc4f8 \ud544\uc694\ub294 \uc5c6\uc2b5\ub2c8\ub2e4.\ub2e4\uc74c\uc740\ud30c\uc774\ud1a4\uc744 \uc704\ud55c \uae30\uc131\ud488 \uad6c\ud604\uc758 \uc608\uc785\ub2c8\ub2e4.\ubaa8\ub4e0\uc0c8 \uc694\uccad\uc5d0 \ub300\ud574 \uc0c8 \ud1a0\ud070\uc744 \uc0dd\uc131\ud558\ub294 \uac83\uc740 \uc758\ubbf8\uac00\uc5c6\uc2b5\ub2c8\ub2e4.\ud1a0\ud070\uc744\uc0dd\uc131\ud560 \ub54c \uae30\ud55c\uc744 \ucd5c\ub300 60\ubd84\uc73c\ub85c\uc124\uc815\ud558\uace0,\uc774\uae30\uac04 \ub3d9\uc548 \ub3d9\uc77c\ud55c \ud1a0\ud070\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<\/p>

<\/path><\/path><\/svg><\/span>
import<\/span> time<\/span>,<\/span> uuid<\/span><\/span> from<\/span> authlib<\/span>.<\/span>jose <\/span>import<\/span> jwt<\/span><\/span> <\/span> BUNDLE_ID <\/span>=<\/span> <\/span>'<\/span>com.adapty.sample_app<\/span>'<\/span><\/span> ISSUER_ID <\/span>=<\/span> <\/span>'<\/span>4336a124-f214-4d40-883b-6db275b5e4aa<\/span>'<\/span><\/span> KEY_ID <\/span>=<\/span> <\/span>'<\/span>J65UYBDA74<\/span>'<\/span><\/span> PRIVATE_KEY <\/span>=<\/span> <\/span>'''<\/span><\/span> -----BEGIN PRIVATE KEY-----<\/span><\/span> MIGTAgMGByqGSMBHkAQQgR\/fR+3Lkg4...<\/span><\/span> -----END PRIVATE KEY-----<\/span><\/span> '''<\/span><\/span> <\/span> issue_time <\/span>=<\/span> <\/span>round<\/span>(<\/span>time<\/span>.<\/span>time<\/span>())<\/span><\/span> expiration_time <\/span>=<\/span> issue_time <\/span>+<\/span> <\/span>60<\/span> <\/span>*<\/span> <\/span>60<\/span> <\/span># 1 hour expiration<\/span><\/span> <\/span> <\/span> header <\/span>=<\/span> <\/span>{<\/span><\/span>  <\/span>'<\/span>alg<\/span>'<\/span>:<\/span> <\/span>'<\/span>ES256<\/span>'<\/span>,<\/span><\/span>  <\/span>'<\/span>kid<\/span>'<\/span>:<\/span> KEY_ID<\/span>,<\/span><\/span>  <\/span>'<\/span>typ<\/span>'<\/span>:<\/span> <\/span>'<\/span>JWT<\/span>'<\/span><\/span> }<\/span><\/span> <\/span> payload <\/span>=<\/span> <\/span>{<\/span><\/span>  <\/span>'<\/span>iss<\/span>'<\/span>:<\/span> ISSUER_ID<\/span>,<\/span><\/span>  <\/span>'<\/span>iat<\/span>'<\/span>:<\/span> issue_time<\/span>,<\/span><\/span>  <\/span>'<\/span>exp<\/span>'<\/span>:<\/span> expiration_time<\/span>,<\/span><\/span>  <\/span>'<\/span>aud<\/span>'<\/span>:<\/span> <\/span>'<\/span>appstoreconnect-v1<\/span>'<\/span>,<\/span><\/span>  <\/span>'<\/span>nonce<\/span>'<\/span>:<\/span> <\/span>str<\/span>(<\/span>uuid<\/span>.<\/span>uuid4<\/span>()),<\/span><\/span>  <\/span>'<\/span>bid<\/span>'<\/span>:<\/span> BUNDLE_ID<\/span><\/span> }<\/span><\/span> <\/span> token_encoded <\/span>=<\/span> jwt<\/span>.<\/span>encode<\/span>(<\/span>header<\/span>,<\/span> payload<\/span>,<\/span> PRIVATE_KEY<\/span>)<\/span><\/span> token_decoded <\/span>=<\/span> token_encoded<\/span>.<\/span>decode<\/span>()<\/span><\/span> <\/span> authorization_header <\/span>=<\/span> <\/span>{<\/span><\/span>  <\/span>'<\/span>Authorization<\/span>'<\/span>:<\/span> <\/span>f<\/span>'Bearer <\/span>{<\/span>token_decoded<\/span>}<\/span>'<\/span><\/span> }<\/span><\/span><\/code><\/pre><\/div>    

\uc11c\uba85\ub41c\uac70\ub798<\/h2>

\uc0c8\ubc84\uc804\uc758 API\uc5d0\uc11c\ub294\ubaa8\ub4e0 \uac70\ub798\uac00 JSONWeb Signature (JWS) \ud45c\uc900\uc73c\ub85c\ubc18\ud658\ub429\ub2c8\ub2e4.\uc774\uac83\uc740\uc810\uc73c\ub85c \ub098\ub204\uc5b4\uc9c4 \uc138 \ubd80\ubd84\uc73c\ub85c \uad6c\uc131\ub41c \ubb38\uc790\uc5f4\uc785\ub2c8\ub2e4. <\/p>

1. Base64 \ud5e4\ub354.<\/p>

2. Base64 \uac70\ub798 \ud398\uc774\ub85c\ub4dc.<\/p>

3. \uac70\ub798 \uc11c\uba85.<\/p>

<\/path><\/path><\/svg><\/span>
Base<\/span>64<\/span>(header) + <\/span>"<\/span>.<\/span>"<\/span> + Base<\/span>64<\/span>(payload) + <\/span>"<\/span>.<\/span>"<\/span> + sign(Base<\/span>64<\/span>(header) + <\/span>"<\/span>.<\/span>"<\/span> + Base<\/span>64<\/span>(payload))<\/span><\/span><\/code><\/pre><\/div>    

\uac70\ub798\ud5e4\ub354<\/h3>

\uac70\ub798\uac00\uc778\uc99d\ub418\uc5c8\ub294\uc9c0 \ud655\uc778\ud558\ub824\uba74 \ud5e4\ub354\uac00 \ud544\uc694\ud569\ub2c8\ub2e4.Alg \ud0a4\ub294\uc554\ud638\ud654 \uc54c\uace0\ub9ac\uc998\uc744 \ud3ec\ud568\ud558\uace0,x5c \ud0a4\ub294\uc778\uc99d\uc11c \uccb4\uc778\uc744 \ud3ec\ud568\ud569\ub2c8\ub2e4.<\/p>

<\/path><\/path><\/svg><\/span>
{<\/span><\/span>   <\/span>"<\/span>kid<\/span>"<\/span>:<\/span> <\/span>"<\/span>AMP\/DEV<\/span>"<\/span>,<\/span><\/span>   <\/span>"<\/span>alg<\/span>"<\/span>:<\/span> <\/span>"<\/span>ES256<\/span>"<\/span>,<\/span><\/span>   <\/span>"<\/span>x5c<\/span>"<\/span>:<\/span> <\/span>[<\/span><\/span>     <\/span>"<\/span>MIIEO...<\/span>"<\/span>,<\/span><\/span>     <\/span>"<\/span>MIIDK...<\/span>"<\/span><\/span>   <\/span>]<\/span><\/span> }<\/span><\/span><\/code><\/pre><\/div>    

\uac70\ub798\ud398\uc774\ub85c\ub4dc<\/h3>
<\/path><\/path><\/svg><\/span>
{<\/span><\/span>   <\/span>"<\/span>transactionId<\/span>"<\/span>:<\/span> <\/span>"<\/span>1000000831360853<\/span>"<\/span>,<\/span><\/span>   <\/span>"<\/span>originalTransactionId<\/span>"<\/span>:<\/span> <\/span>"<\/span>1000000806937552<\/span>"<\/span>,<\/span><\/span>   <\/span>"<\/span>webOrderLineItemId<\/span>"<\/span>:<\/span> <\/span>"<\/span>1000000063561721<\/span>"<\/span>,<\/span><\/span>   <\/span>"<\/span>bundleId<\/span>"<\/span>:<\/span> <\/span>"<\/span>com.adapty.sample_app<\/span>"<\/span>,<\/span><\/span>   <\/span>"<\/span>productId<\/span>"<\/span>:<\/span> <\/span>"<\/span>basic_subscription_1_month<\/span>"<\/span>,<\/span><\/span>   <\/span>"<\/span>subscriptionGroupIdentifier<\/span>"<\/span>:<\/span> <\/span>"<\/span>27636320<\/span>"<\/span>,<\/span><\/span>   <\/span>"<\/span>purchaseDate<\/span>"<\/span>:<\/span> <\/span>1624446341000<\/span>,<\/span><\/span>   <\/span>"<\/span>originalPurchaseDate<\/span>"<\/span>:<\/span> <\/span>1619686337000<\/span>,<\/span><\/span>   <\/span>"<\/span>expiresDate<\/span>"<\/span>:<\/span> <\/span>1624446641000<\/span>,<\/span><\/span>   <\/span>"<\/span>quantity<\/span>"<\/span>:<\/span> <\/span>1<\/span>,<\/span><\/span>   <\/span>"<\/span>type<\/span>"<\/span>:<\/span> <\/span>"<\/span>Auto-Renewable Subscription<\/span>"<\/span>,<\/span><\/span>   <\/span>"<\/span>appAccountToken<\/span>"<\/span>:<\/span> <\/span>"<\/span>fd12746f-2d3a-46c8-bff8-55b75ed06aca<\/span>"<\/span>,<\/span><\/span>   <\/span>"<\/span>inAppOwnershipType<\/span>"<\/span>:<\/span> <\/span>"<\/span>PURCHASED<\/span>"<\/span>,<\/span><\/span>   <\/span>"<\/span>signedDate<\/span>"<\/span>:<\/span> <\/span>1624446484882<\/span>,<\/span><\/span>   <\/span>"<\/span>offerType<\/span>"<\/span>:<\/span> <\/span>2<\/span>,<\/span><\/span>   <\/span>"<\/span>offerIdentifier<\/span>"<\/span>:<\/span> <\/span>"<\/span>basic_subscription_1_month.pay_as_you_go.3_months<\/span>"<\/span><\/span> }<\/span><\/span><\/code><\/pre><\/div>    

Apple\uc740\uac70\ub798 \ud615\uc2dd\uc744 \ubcc0\uacbd \ubc0f \ud655\uc7a5\ud588\uc2b5\ub2c8\ub2e4.\uc9c0\uae08\uc740\uadf8\ub4e4\uacfc \ud568\uaed8 \uc77c\ud558\ub294 \uac83\uc774 \ub354 \ud3b8\ub9ac\ud558\ub2e4\uace0 \uc0dd\uac01\ub429\ub2c8\ub2e4.\uc0c8\ud615\uc2dd\uc5d0 \ub300\ud55c \uc790\uc138\ud55c \ub0b4\uc6a9\uc740 \ubb38\uc11c<\/a>\uc5d0\ub098\uc640\uc788\uc2b5\ub2c8\ub2e4.\uc544\ub798\uc5d0\uc11c\uac00\uc7a5 \uc911\uc694\ud55c \ubcc0\uacbd \uc0ac\ud56d\uc5d0 \ub300\ud574 \uc124\uba85\ud558\uaca0\uc2b5\ub2c8\ub2e4. <\/p>