{"id":2996,"date":"2026-02-06T11:16:34","date_gmt":"2026-02-06T02:16:34","guid":{"rendered":"https:\/\/skanto.co.kr\/?p=2996"},"modified":"2026-02-06T11:16:34","modified_gmt":"2026-02-06T02:16:34","slug":"token-exchange","status":"publish","type":"post","link":"https:\/\/skanto.co.kr\/?p=2996","title":{"rendered":"Token Exchange"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Impersonation vs Delegation<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*T7Xl77B4wE5XP7JKxLH-yQ.png\" alt=\"\" style=\"aspect-ratio:3.3964767450431195;width:840px;height:auto\"\/><\/figure>\n\n\n\n<p><strong>Bob<\/strong>: a music enthusiast who has meticulously curated a collection of super cool playlists on an online music streaming platform<\/p>\n\n\n\n<p><strong>Alice<\/strong>: a close friend of Bob\u2019s, who seeks access to his playlists to find the perfect soundtrack for her upcoming road trip<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*E1uDSbwCuPD9gQcatCIfqw.png\" alt=\"\" style=\"aspect-ratio:3.892549417131272;width:840px;height:auto\"\/><\/figure>\n\n\n\n<p>Alice is impersonating Bob<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"text-decoration: underline;\">The access credentials<\/span> provided to the streaming platform <span style=\"text-decoration: underline;\">don\u2019t contain any information to recognize Alice\u2019s identity<\/span>.<\/li>\n\n\n\n<li>Whenever Alice accesses the platform, <span style=\"text-decoration: underline;\">it believes Bob is the one using the service<\/span> although the credentials used by Alice to access the service <span style=\"text-decoration: underline;\">are different from Bob\u2019s credentials<\/span>.<\/li>\n<\/ul>\n\n\n\n<p>The music streaming service has <strong>introduced features to support family and friend sharing<\/strong>. Alice can pass her identity information along with the temporary pass provided by Bob<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*H7ac4jBeehzbVdSd24gapg.png\" alt=\"\" style=\"aspect-ratio:3.9347621893945863;width:836px;height:auto\"\/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The access credentials to the streaming service <span style=\"text-decoration: underline;\">contain information to recognize Alice\u2019s identity in addition to Bob\u2019s identity<\/span>.<\/li>\n\n\n\n<li>When Alice accesses the service, <span style=\"text-decoration: underline;\">it distinguishes between Bob and Alice<\/span>, acknowledging Alice as Bob\u2019s agent.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">API Gateway Calls Backend API on Behalf of a Client<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*Nyw0JEOfmoeW-Cu2q0k8Zg.png\" alt=\"\" style=\"aspect-ratio:3.981042654028436;width:840px;height:auto\"\/><\/figure>\n\n\n\n<p>If you try to use the same token with the BE-API, <strong>it won\u2019t work because the token isn\u2019t intended for the BE-API and will be rejected by the BE-API<\/strong> after looking at the audience claim.<\/p>\n\n\n\n<p><strong>API-GW to request a new security token suitable for calling the backend API<\/strong> from the IdP by trading the current token sent by the client application.<\/p>\n\n\n\n<p>The <span style=\"text-decoration: underline;\">Token Exchange grant type<\/span> facilitates this exchange, <span style=\"text-decoration: underline;\">allowing the API-GW to request the audience and request scopes<\/span> from the backend API.<\/p>\n\n\n\n<p><strong>In impersonation<\/strong>, the API-GW keeps its identity hidden from the backend API and acts as the end user accessing the API through the client application.<\/p>\n\n\n\n<p><strong>In delegation<\/strong>, the <span style=\"text-decoration: underline;\">backend API recognizes that the API-GW is acting on behalf of the client application<\/span>, which has obtained authorization from the end user.<\/p>\n\n\n\n<p>The choice between these approaches depends on the specific design, business and security requirements of the system.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Microservice Calls Another Downstream Microservice<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*xL7rXMkoetu3VigC32-teA.png\" alt=\"\" style=\"aspect-ratio:4.311780668101432;width:840px;height:auto\"\/><\/figure>\n\n\n\n<p>if you try to use the same token with the Order-Service, it won\u2019t work because <strong>the token isn\u2019t intended for the Order-Service<\/strong> and will be rejected by the Order-Service after looking at the audience claim.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Upgrading or downgrading the Scope of Security Tokens<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*I8CU6pYJWt7Pgmn3vO7x2Q.png\" alt=\"\" style=\"aspect-ratio:1.2766311123424297;width:840px;height:auto\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">The principle of elastic privilege<\/h3>\n\n\n\n<p>Applications should initially request a token <strong>with the minimal scopes<\/strong> required for current functionality, <strong>without making assumptions about future functionality<\/strong> that might require additional scopes.<\/p>\n\n\n\n<p>Token Exchange becomes practical in such scenarios, allowing the application to obtain the required access token with required scopes when needed.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Application Accessing Resources in a Different Trust Domain<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*S2iA3I8gL0k7YBbvgCM4Og.png\" alt=\"\" style=\"aspect-ratio:2.1115337029739267;width:840px;height:auto\"\/><\/figure>\n\n\n\n<p>This is another use case perfectly suited for the Token Exchange grant type. However, compared to previous scenarios, this involves <strong>two trust domains<\/strong> and <strong>two IdPs<\/strong>, <strong>necessitating the existence of a trust relationship between these IdPs<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Workload Identity Federation<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*a1xy0ABn2L7-Is3zFD78EQ.png\" alt=\"\" style=\"aspect-ratio:2.1115337029739267;width:840px;height:auto\"\/><\/figure>\n\n\n\n<p>The Token Exchange grant type is very flexible, it lays out request and response messages, along with the message flow. However, it leaves certain crucial aspects open for implementation decisions, such as the <strong>supported token types<\/strong> and <strong>trust relationships<\/strong>, which are particularly <strong>important in cross-domain scenarios<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Request, response and the flow<\/h2>\n\n\n\n<p>The scenario where token exchange occurs <strong>within the same trust domain<\/strong>, facilitated by a single Identity Provider (IdP).<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*cuhDIPwe-HM1vYmyT8VkMA.png\" alt=\"\" style=\"aspect-ratio:2.491618903428139;width:840px;height:auto\"\/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>This is an example where an <strong>API-GW<\/strong> that is generally recognized as a Resource Server (RS) within the OAuth2 terminology is <strong>designated as an OAuth2 client<\/strong> within the context of the Token Exchange. In the bottom line, depending on the circumstance, an entity different from a traditional OAuth2 client (e.g. \u2014 web and mobile apps) can <strong>participate in the Token Exchange by playing the client role.<\/strong><\/li>\n<\/ul>\n\n\n\n<p>As per the Token Exchange specification, the following parameters are mandatory in the request:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*700YsbXT-4nakUNekgSJXw.png\" alt=\"\" style=\"aspect-ratio:2.4243699689588047;width:840px;height:auto\"\/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>grant_type<\/strong>: This parameter signals to the IdP that this is a token exchange request.<\/li>\n\n\n\n<li><strong>subject_token<\/strong>: This parameter carries <span style=\"text-decoration: underline;\">the current token received from the client<\/span>, intended for exchange.<\/li>\n\n\n\n<li><strong>subject_token_type<\/strong>: Denotes the type of the subject token (e.g., OAuth2 access token, OIDC IDToken, or SAML token).<\/li>\n\n\n\n<li><strong>requested_token_type<\/strong>: (Optional) This parameter allows the client application to specify the <span style=\"text-decoration: underline;\">desired token type<\/span>. In the absence, the IdP may determine the token type based on the application\u2019s configuration.<\/li>\n<\/ul>\n\n\n\n<p>While not mandatory, parameters such as <strong>audience, resource, and scope<\/strong> are valuable for providing <strong>essential information about the target backend service<\/strong> to the IdP. This information <strong>helps the IdP identify the appropriate access policy for the target backend<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*7WAV4LOKNtTPsWG2Et5LPg.png\" alt=\"\" style=\"aspect-ratio:2.8687044761252567;width:840px;height:auto\"\/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>resource: points to the location of the target, often represented as an HTTP URL.<\/li>\n\n\n\n<li>audience: reserved for the logical name associated with the target, a logical target name recognized by the Identity Provider (IdP).<\/li>\n\n\n\n<li>scope: you can include these scopes within the \u2018scope\u2019 request parameter.<\/li>\n<\/ul>\n\n\n\n<p>In the impersonation use case demonstrated above, to employ Token Exchange in delegation, two additional parameters are required:\u00a0<em><strong>actor_token<\/strong><\/em> and\u00a0<em><strong>actor_token_type<\/strong><\/em>. These parameters provide identity information about the party requesting a new token.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*j_n2EN0RVBmagwVg1hvQzw.png\" alt=\"\" style=\"aspect-ratio:1.795581186922807;width:840px;height:auto\"\/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>actor_token<\/strong>: The token that contains the information related to the identity of the token requesting party.<\/li>\n\n\n\n<li><strong>actor_token_type<\/strong>: Denotes the type of the actor token.<\/li>\n<\/ul>\n\n\n\n<p>The specification does not define any specific criteria for subject tokens to be considered valid for the token exchange. Nevertheless, it introduces the\u00a0<em><strong>may_act<\/strong><\/em>\u00a0claim, which an IdP could utilize to ascertain whether the requesting party is authorized to exchange their current subject token for a delegated token. This authorization can be verified <span style=\"text-decoration: underline;\">by cross-referencing the\u00a0<em>may_act<\/em>\u00a0claim with either the requesting client\u2019s identity or the identity information of the actor token<\/span>.<\/p>\n\n\n\n<p>there\u2019s no standardized method for configuring and including\u00a0<em>may_act\u00a0<\/em>in the initial token destined to become the subject token in a subsequent stage.<\/p>\n\n\n\n<p>The Token Exchange specification does not impose specific requirements for client registration or client authentication. However, in practical implementations, client authentication, often involving client secrets or other methods, is commonly employed to achieve the desired protection.<\/p>\n\n\n\n<p>The Token Exchange response closely resembles standard OAuth2 responses but includes two additional parameters:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>issued_token_type<\/strong>: This parameter signifies the type of the issued token, aligning with parameters like\u00a0<em><code>requested_token_type<\/code>,<\/em>\u00a0<em><code>subject_token_type<\/code>,<\/em>\u00a0and\u00a0<em><code>actor_token_type<\/code><\/em>\u00a0from the request.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*yxTfj1KAvf1EoiTz6AVRPQ.png\" alt=\"\" style=\"width:840px;height:auto\"\/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>token_type<\/strong>: Unlike the previously mentioned parameters, this parameter informs the client how to use the access token to access the target resources. For example, a value of\u00a0<strong>Bearer<\/strong>\u00a0indicates that the issued security token can be presented as is, without additional proof of eligibility.<\/li>\n<\/ul>\n\n\n\n<p>the\u00a0<strong>access_token<\/strong>\u00a0parameter in the response can be used to return various token types, not limited solely to access tokens. Here is a sample Token Exchange response message which returns an access token.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n    \"access_token\": \"eyJ4NXQiOiJOMk5tTUdGbE16UmtPV0l4WXpjNE9XTTNNekl5TURKaVpXVXdZMlF3T0dNeE5ERTVPV1JtWWpRd05EWXlOakkwTkRVM05UTmtZekl4TmpNNFl6RmxaQSIsImtpZCI6Ik4yTm1NR0ZsTXpSa09XSXhZemM0T1dNM016SXlNREppWldVd1kyUXdPR014TkRFNU9XUm1ZalF3TkRZeU5qSTBORFUzTlROa1l6SXhOak00WXpGbFpBX1JTMjU2IiwidHlwIjoiYXQrand0IiwiYWxnIjoiUlMyNTYifQ.eyJzdWIiOiIzM2Q5N2NjNS00M2M2LTQ0N2EtODE4Yi0xYWM4MDY2ZjU5ZDIiLCJhdXQiOiJBUFBMSUNBVElPTl9VU0VSIiwiYXVkIjoiXzM4Vm5YS0gyWTNyRDk5M21ZSEpNMWhWQzdVYSIsIm5iZiI6MTY5NTI2MzQ3NywiYXpwIjoiXzM4Vm5YS0gyWTNyRDk5M21ZSEpNMWhWQzdVYSIsIm9yZ19pZCI6Ijc0Y2MwZjJiLWUyMGYtNGQyNy1iYjQ1LTg2YjU0ODFhYWNiYyIsImlzcyI6Imh0dHBzOlwvXC9hcGkuYXNnYXJkZW8uaW9cL3RcL3NhZ2FyYW9yZ1wvb2F1dGgyXC90b2tlbiIsImV4cCI6MTY5NTI2NzA3Nywib3JnX25hbWUiOiJzYWdhcmFvcmciLCJpYXQiOjE2OTUyNjM0NzcsImp0aSI6ImM2ZmUyNDZhLWZkMDQtNDQ2Ni1hOGMwLTA4MzczYTMxNGY0MyIsImNsaWVudF9pZCI6Il8zOFZuWEtIMlkzckQ5OTNtWUhKTTFoVkM3VWEifQ.F6v5STHQVTvqsiYbVAbjgdeaj0QgMpkyVvxE5vd3aVUyGD3kNLw-C0ZaekNPDy6i--YKfhYljBKc3gqkO-YbZnpgAbZj7eCxOlNAp_JXqaAlU_sIP30PbCvXLBgLe5mwdJtMSI7NDSQ5nUo4TI_ZZp7HluTZ4nfvKJR1YKltp4D0eQLDCUfiIJHEwsafoAcANKfTbzEtg1vekChdstrakYP9na2xxGYAYZrdJgbUui2CnvfWpxwSRUqybJ_lM-CnrL-XSY70ppTB-y0RpcGtBAN0Usb1631-kbRXLDC8uZwN_pRjDywM5kjzvvrWkJWOuKKXzY1DDBJMEDWhWDWIPw\",\n    \"issued_token_type\": \"urn:ietf:params:oauth:token-type:jwt\",\n    \"token_type\": \"Bearer\",\n    \"expires_in\": 3600\n}<\/code><\/pre>\n\n\n\n<p>Let\u2019s move into a cross-domain use case that we discussed above which involves two different IdPs.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*u9BLClSxr3XLnbEmiN6c3g.png\" alt=\"\" style=\"aspect-ratio:2.315228859970859;width:840px;height:auto\"\/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>In this scenario, the Sales app initially acquires an access token from the Sales-IdP. This token allows access to the required API calls within the Sales-API.<\/li>\n\n\n\n<li>When the application needs to call the Loyalty-API to complete a business transaction, it creates a Token Exchange request. This request utilizes the current access token issued by the Sales-IdP.<\/li>\n\n\n\n<li>The Loyalty-IdP validates the received Token Exchange request. Notably, Loyalty-IdP recognizes the subject token\u2019s origin, issued by the Sales-IdP, and proceeds to validate the token\u2019s signature. While the specification does not prescribe a trust model or verification mechanism, a widely used approach is the JSON Web Key Set (JWKS), which contains public keys for signature verification. To establish trust, Loyalty-IdP should be configured with a JWKS URL from the Sales-IdP. However, it\u2019s possible for an Idp to use different mechanisms to obtain the public keys of the other IdP involved such as directly uploading public keys.<\/li>\n\n\n\n<li>Upon successful verification, Loyalty-IdP issues a new access token, tailored to the correct audience and scope values required to access the Loyalty-API.<\/li>\n\n\n\n<li>The Sales app utilizes the newly received access token to seamlessly call the Loyalty-API and complete the intended business transaction.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">The act claim<\/h2>\n\n\n\n<p>The\u00a0<em>act<\/em>\u00a0claim can be included in the introspection response of a delegated token, serving a consistent purpose throughout the token exchange process.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*Z9UrE6wKVBf6_96hbzw9Dw.png\" alt=\"\" style=\"aspect-ratio:3.2145099407045694;width:840px;height:auto\"\/><\/figure>\n\n\n\n<p>This structural flexibility is significant because it allows the\u00a0<em>act<\/em>\u00a0claim to capture a delegation chain by nesting\u00a0<em>act<\/em>\u00a0claims within one another. However, when making policy decisions, <span style=\"text-decoration: underline;\">only the outermost\u00a0<em>act<\/em>\u00a0claim should be considered and the nested\u00a0<em>act<\/em>\u00a0claims are to provide information about the delegation chain.<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*D37iMr0ORS9yBdjsog_ORg.png\" alt=\"\" style=\"aspect-ratio:2.7800904977375565;width:836px;height:auto\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">How does OAuth Token Exchange work?<\/h2>\n\n\n\n<p>Token Exchange is a protocol where <span style=\"text-decoration: underline;\">an existing token<\/span> <strong><span style=\"text-decoration: underline;\">acts as the authorization grant for requesting a new token<\/span><\/strong>. This existing token, known as the subject token, serves as the foundation for the exchange. <\/p>\n\n\n\n<p>While the specification does not <span style=\"text-decoration: underline;\">require client authentication during a token exchange request<\/span>, it is strongly recommended.<\/p>\n\n\n\n<p>The token exchange protocol categorizes security tokens into <strong>three distinct types<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Subject token<\/strong>: identifies the entity on whose behalf the client is requesting a new token. In most cases <strong>the subject remains unchanged<\/strong>. For example, when backend services use token exchange to reduce the scope of existing access tokens, any new access tokens still represent the same users.<\/li>\n\n\n\n<li><strong>Actor token<\/strong>: an optional token, <span style=\"text-decoration: underline;\">represents the entity attempting to act on behalf of the subject<\/span>. While the newly issued token continues to reflect the same subject as the original subject token, <strong>it may also include a claim that identifies the actor<\/strong>, providing additional context about who is making the request.<\/li>\n\n\n\n<li><strong>Requested token<\/strong>: is the <strong>token returned by the authorization server<\/strong> in response to a token exchange request. The authorization server issues the new token based on its policy, typically <span style=\"text-decoration: underline;\">considering factors like the requested scope, token types, resources, and audiences<\/span>.<\/li>\n<\/ul>\n\n\n\n<p>Example of a Token Exchange Request:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>POST \/token HTTP\/1.1\nHost: authorization-server.com\nContent-Type: application\/x-www-form-urlencoded\n<strong>grant_type<\/strong>=urn:ietf:params:oauth:grant-type:token-exchange\n&amp;<strong>subject_token<\/strong>=eyJhbGciOiJIUzI1NiIsInR\u2026 (existing token)\n&amp;<strong>subject_token_type<\/strong>=urn:ietf:params:oauth:token-type:access_token\n&amp;<strong>requested_token_type<\/strong>=urn:ietf:params:oauth:token-type:refresh_token\n&amp;<strong>audience<\/strong>=https:\/\/api.target-service.com\n&amp;<strong>scope<\/strong>=read write<\/code><\/pre>\n\n\n\n<p>Example of a Token Exchange Response:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n\u201caccess_token\u201d: \u201cnew-access-token\u201d,\n\u201ctoken_type\u201d: \u201cBearer\u201d,\n\u201cexpires_in\u201d: 3600,\n\u201cissued_token_type\u201d: \u201curn:ietf:params:oauth:token-type:access_token\u201d\n}<\/code><\/pre>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Impersonation vs Delegation Bob: a music enthusiast who has meticulously curated a collection of super cool playlists on an online music streaming platform Alice: a close friend of Bob\u2019s, who seeks access to his playlists to find the perfect soundtrack for her upcoming road trip Alice is impersonating Bob The music streaming service has introduced features to support family and friend sharing. Alice can pass her identity information along with the temporary pass provided by Bob API Gateway Calls Backend&#8230;<\/p>\n<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/skanto.co.kr\/?p=2996\"> Read More<span class=\"screen-reader-text\">  Read More<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":""},"categories":[14,7],"tags":[290,291,289],"class_list":["post-2996","post","type-post","status-publish","format-standard","hentry","category-sw-development","category-7","tag-oauth","tag-oidc","tag-token-exchange"],"_links":{"self":[{"href":"https:\/\/skanto.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/2996","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/skanto.co.kr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/skanto.co.kr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/skanto.co.kr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/skanto.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2996"}],"version-history":[{"count":7,"href":"https:\/\/skanto.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/2996\/revisions"}],"predecessor-version":[{"id":3003,"href":"https:\/\/skanto.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/2996\/revisions\/3003"}],"wp:attachment":[{"href":"https:\/\/skanto.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2996"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/skanto.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2996"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/skanto.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2996"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}