<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>hwanguu</title>
    <link>https://hwanguu.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Thu, 11 Jun 2026 04:38:13 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>hwanguu</managingEditor>
    <item>
      <title>OIDC Scope</title>
      <link>https://hwanguu.tistory.com/79</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Scope&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 120px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 16.0465%; height: 20px;&quot;&gt;Scope&lt;/td&gt;
&lt;td style=&quot;width: 83.9535%; height: 20px;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 16.0465%; height: 20px;&quot;&gt;openid&lt;/td&gt;
&lt;td style=&quot;width: 83.9535%; height: 20px;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt; 필수&lt;/b&gt;&lt;/span&gt;, 클라이언트가 OpenID Connect 요청을 하고 있음을 인증 서버에 알린다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 16.0465%; height: 20px;&quot;&gt;profile&lt;/td&gt;
&lt;td style=&quot;width: 83.9535%; height: 20px;&quot;&gt;기본 프로필 클레임에 대한 액세스 요청&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 16.0465%; height: 20px;&quot;&gt;email&lt;/td&gt;
&lt;td style=&quot;width: 83.9535%; height: 20px;&quot;&gt;이메일 및 email_verified 클레임에 대한 액세스 요청&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 16.0465%; height: 20px;&quot;&gt;address&lt;/td&gt;
&lt;td style=&quot;width: 83.9535%; height: 20px;&quot;&gt;주소 클레임에 대한 액세스 요청&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 16.0465%; height: 20px;&quot;&gt;phone&lt;/td&gt;
&lt;td style=&quot;width: 83.9535%; height: 20px;&quot;&gt;phone_number 및 phone_number_verified 클레임에 대한 액세스 요청&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Scope 는 위의 스코프 이외에 Custom 으로도 생성할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Request URL&lt;/p&gt;
&lt;pre id=&quot;code_1737040282623&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;localhost:8080/realms/oauth2/protocol/openid-connect/auth?
response_type=code
&amp;amp;client_id=oauth2-client-app
&amp;amp;scope=openid profile email
&amp;amp;redirect_uri=http://localhost:8081&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Response&lt;/p&gt;
&lt;pre id=&quot;code_1737040363368&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
    &quot;access_token&quot;: &quot;...&quot;,
    &quot;expires_in&quot;: 300,
    &quot;refresh_expires_in&quot;: 1800,
    &quot;refresh_token&quot;: &quot;...&quot;,
    &quot;token_type&quot;: &quot;Bearer&quot;,
    &quot;id_token&quot;: &quot;eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJqOXYyeTNJN0RzTy02aFhqanFGUi1YSURWd2RvWUwyemRfVjN3c05EREFZIn0.eyJleHAiOjE3MzcwNDA2MzMsImlhdCI6MTczNzA0MDMzMywiYXV0aF90aW1lIjoxNzM3MDQwMzIxLCJqdGkiOiI4NjhiY2IyZC00YTJlLTRkYjQtOWJkMy01YjJjNTZkM2M5YzQiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL29hdXRoMiIsImF1ZCI6Im9hdXRoMi1jbGllbnQtYXBwIiwic3ViIjoiYjdiZjc5OTgtNWM5OC00ODZiLTk3YmItYjgzMDM3NDBkZGI3IiwidHlwIjoiSUQiLCJhenAiOiJvYXV0aDItY2xpZW50LWFwcCIsInNlc3Npb25fc3RhdGUiOiJkMjAwNTY4Ni01ZTJiLTRhMWMtYmUwZi02YTk4NGQxZWM4YWYiLCJhdF9oYXNoIjoiVjN1U1RPSWVEeko0ZWRvYWlWTU5aUSIsImFjciI6IjEiLCJzaWQiOiJkMjAwNTY4Ni01ZTJiLTRhMWMtYmUwZi02YTk4NGQxZWM4YWYiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsIm5hbWUiOiJjaG9pIHNlaHdhbiIsInByZWZlcnJlZF91c2VybmFtZSI6InVzZXIiLCJnaXZlbl9uYW1lIjoiY2hvaSIsImZhbWlseV9uYW1lIjoic2Vod2FuIiwiZW1haWwiOiJ1c2VyQG5hdmVyLmNvbSJ9.nfs5J4zu7ntb6Hc0nZCswiCuj7h17jwem9OUWwDSsjQoRMKDsgfY52TIfSH4p-_4t2O0gGZno0IeafohJscBbxMiU09mfCZvIyOKWvhCzYs4P0svZeE10B-DPC1X96-U6R9B0TJ_oHdaDkxb2L4pfRiiSje8Xdo6kyvYufKXb595nCxbuIIuVJc8VtWowPzlX5HahIXfdDiZWMrE6PftgvwXB09nwTHgZ5MRJbGv1uRiPdk36XskxNd_00fxUfc_UqW1T6J4NrIXifW1E37STvkZC7kpvglDq1h0NEVbeneKw7JDmoP3In-anDwvDYTqAznDrUZy_2DNBOkVh1MHHw&quot;,
    &quot;not-before-policy&quot;: 0,
    &quot;session_state&quot;: &quot;d2005686-5e2b-4a1c-be0f-6a984d1ec8af&quot;,
    &quot;scope&quot;: &quot;openid email profile&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;id_token을 디코딩하면 아래와 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1737040422375&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;exp&quot;: 1737040633,
  &quot;iat&quot;: 1737040333,
  &quot;auth_time&quot;: 1737040321,
  &quot;jti&quot;: &quot;868bcb2d-4a2e-4db4-9bd3-5b2c56d3c9c4&quot;,
  &quot;iss&quot;: &quot;http://localhost:8080/realms/oauth2&quot;,
  &quot;aud&quot;: &quot;oauth2-client-app&quot;,
  &quot;sub&quot;: &quot;b7bf7998-5c98-486b-97bb-b8303740ddb7&quot;,
  &quot;typ&quot;: &quot;ID&quot;,
  &quot;azp&quot;: &quot;oauth2-client-app&quot;,
  &quot;session_state&quot;: &quot;d2005686-5e2b-4a1c-be0f-6a984d1ec8af&quot;,
  &quot;at_hash&quot;: &quot;V3uSTOIeDzJ4edoaiVMNZQ&quot;,
  &quot;acr&quot;: &quot;1&quot;,
  &quot;sid&quot;: &quot;d2005686-5e2b-4a1c-be0f-6a984d1ec8af&quot;,
  &quot;email_verified&quot;: false,
  &quot;name&quot;: &quot;hong gil dong&quot;,
  &quot;preferred_username&quot;: &quot;user&quot;,
  &quot;given_name&quot;: &quot;hong&quot;,
  &quot;family_name&quot;: &quot;gil dong&quot;,
  &quot;email&quot;: &quot;user@naver.com&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Claim의 종류&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Standard Claims&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;name&lt;/li&gt;
&lt;li&gt;family_name&lt;/li&gt;
&lt;li&gt;given_name&lt;/li&gt;
&lt;li&gt;middle_name&lt;/li&gt;
&lt;li&gt;nickname&lt;/li&gt;
&lt;li&gt;preferred_username&lt;/li&gt;
&lt;li&gt;profile&lt;/li&gt;
&lt;li&gt;picture&lt;/li&gt;
&lt;li&gt;website&lt;/li&gt;
&lt;li&gt;gender&lt;/li&gt;
&lt;li&gt;birthdate&lt;/li&gt;
&lt;li&gt;zoneinfo&lt;/li&gt;
&lt;li&gt;locale&lt;/li&gt;
&lt;li&gt;updated_at&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Address Claims&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;formatted&lt;/li&gt;
&lt;li&gt;street_address&lt;/li&gt;
&lt;li&gt;locality&lt;/li&gt;
&lt;li&gt;region&lt;/li&gt;
&lt;li&gt;postal_code&lt;/li&gt;
&lt;li&gt;country&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 Claim은 UserInfo를 구성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;references-및-사진-출처&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;References 및 사진 출처&lt;/h2&gt;
&lt;blockquote style=&quot;color: #000000; text-align: start;&quot; data-ke-style=&quot;style2&quot;&gt;정수원 스프링 시큐리티 OAuth2&lt;/blockquote&gt;</description>
      <category>Spring/Oauth2</category>
      <author>hwanguu</author>
      <guid isPermaLink="true">https://hwanguu.tistory.com/79</guid>
      <comments>https://hwanguu.tistory.com/79#entry79comment</comments>
      <pubDate>Fri, 17 Jan 2025 00:16:53 +0900</pubDate>
    </item>
    <item>
      <title>ID Token</title>
      <link>https://hwanguu.tistory.com/78</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;ID Token 이란&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ID Token은 사용자가 인증 되었음을 증명하는 토큰이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ID 토큰은 사용자가 인증 되었음을 증명하는 결과물로서 OIDC 요청 시 access token 과 함께 클라이언트에게 전달되는 토큰이다&lt;/li&gt;
&lt;li&gt;ID 토큰은 JWT(JSON 웹 토큰)으로 표현되며 헤더, 페이로드 및 서명으로 구성된다&lt;/li&gt;
&lt;li&gt;ID 토큰은 개인 키로 발급자가 서명하는 것으로서 토큰의 출처를 보장하고 변조되지 않았음을 보장한다.&lt;/li&gt;
&lt;li&gt;어플리케이션은 공개 키로 ID 토큰을 검증 및 유효성을 검사하고 만료여부 등 토큰의 클레임을 확인 한다&lt;/li&gt;
&lt;li&gt;클라이언트는 클레임 정보에 포함되어 있는 사용자명, 이메일을 활용하여 인증 관리를 할 수 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ID Token vs Access Token&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ID Token&lt;/b&gt; 은 OpenID Provider에서 사용자가 인증 되었을때 발급되며 클라이언트(서버)에서 사용자의 신원확인을 위해 사용되어져야 한다. &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;API 호출에 사용하면 안된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Access Token&lt;/b&gt; 은 인증을 위해 사용되는 것이 아닌 Authorization Server 에서 발급 받은후 Resource Server에 접근하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위해 사용되는 Token 이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ID Token, Access Token 비교&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;구분&lt;/td&gt;
&lt;td&gt;ID Token&lt;/td&gt;
&lt;td&gt;Access Token&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;목적&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;사용자 인증 정보 제공&lt;/td&gt;
&lt;td&gt;API 요청에 대한 권한 부여&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;발급 프로토콜&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;OpenID Connect&lt;/td&gt;
&lt;td&gt;OAuth 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;주요 사용처&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;클라이언트 애플리케이션에서 신원 확인&lt;/td&gt;
&lt;td&gt;리소스 서버(API)에 요청 인증&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;포맷&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;일반적으로 JWT&lt;/td&gt;
&lt;td&gt;JWT 또는 기타 형식&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;수명&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;보통 짧음&lt;/td&gt;
&lt;td&gt;보통 짧지만 Refresh Token으로 연장 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ID Token&lt;/b&gt;은 &quot;이 사용자는 누구인가?&quot;를 증명하는 데 사용되며&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Access Token&lt;/b&gt;은 &quot;이 사용자가 이 리소스에 접근할 수 있는 권한이 있는가?&quot;를 확인하는 데 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;references-및-사진-출처&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;References 및 사진 출처&lt;/h2&gt;
&lt;blockquote style=&quot;color: #000000; text-align: start;&quot; data-ke-style=&quot;style2&quot;&gt;정수원 스프링 시큐리티 OAuth2&lt;/blockquote&gt;</description>
      <category>Spring/Oauth2</category>
      <author>hwanguu</author>
      <guid isPermaLink="true">https://hwanguu.tistory.com/78</guid>
      <comments>https://hwanguu.tistory.com/78#entry78comment</comments>
      <pubDate>Fri, 17 Jan 2025 00:08:23 +0900</pubDate>
    </item>
    <item>
      <title>Open ID Connect OIDC</title>
      <link>https://hwanguu.tistory.com/77</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;개요 및 특징&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;OpenID Connect 1.0은 OAuth 2.0 프로토콜 위에 구축된 ID 계층으로 OAuth 2.0을 확장하여 인증 방식을 표준화 한 OAuth 2.0 기반의 인증 프로토콜이다&lt;/li&gt;
&lt;li&gt;scope 지정 시 &amp;ldquo;&lt;b&gt;openid&lt;/b&gt;&amp;rdquo; 를 포함하면 OpenID Connect 사용이 가능하며 인증에 대한 정보는 ID 토큰 (ID Token )이라고 하는 JSON 웹 토큰(JWT) 으로 반환된다&lt;/li&gt;
&lt;li&gt;OpenID Connect는 클라이언트가 사용자 ID를 확인할 수 있게 하는 보안 토큰인 ID Token 제공한다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 사진과 같이 scope 에 openid를 넣어야 OIDC가 활성화 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Authorization Code, Implicit, password Credentials, Client Credentials 전부 scope에 openid를 넣으면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;707&quot; data-origin-height=&quot;273&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/smFMn/btsLPPRRXsD/5yHyktkdHEFvkfVIfzZuN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/smFMn/btsLPPRRXsD/5yHyktkdHEFvkfVIfzZuN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/smFMn/btsLPPRRXsD/5yHyktkdHEFvkfVIfzZuN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsmFMn%2FbtsLPPRRXsD%2F5yHyktkdHEFvkfVIfzZuN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;707&quot; height=&quot;273&quot; data-origin-width=&quot;707&quot; data-origin-height=&quot;273&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Oauth 2.0, OIDC 비교&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;925&quot; data-origin-height=&quot;335&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3NBma/btsLOs4FLqY/bo5ZdVKQ6bCkoMSvHzukS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3NBma/btsLOs4FLqY/bo5ZdVKQ6bCkoMSvHzukS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3NBma/btsLOs4FLqY/bo5ZdVKQ6bCkoMSvHzukS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3NBma%2FbtsLOs4FLqY%2Fbo5ZdVKQ6bCkoMSvHzukS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;925&quot; height=&quot;335&quot; data-origin-width=&quot;925&quot; data-origin-height=&quot;335&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Oauth2.0&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용 목적 : Oauth2.0프로토콜은 권한(인가) 획득하기 위해서 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를들어서 네이버에서 페이스북, 인스타그램의 사진을 가지고오고 싶은경우 (가장 많이 사용하는 Authorization Code Flow로 설명)&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;네이버에 회원가입후 로그인을 한다.&lt;/li&gt;
&lt;li&gt;네이버에서 제공하는 페이스북, 인스타그램의 사진 가져오기 기능을 사용한다&lt;/li&gt;
&lt;li&gt;네이버에서는 페이스북, 인스타그램의 권한승인을 받는 페이지로 redirection 시킨다.&lt;/li&gt;
&lt;li&gt;사용자가 페이스북, 인스타그램에서 자신의 데이터를 접근할수 있도록 허용한다.&lt;/li&gt;
&lt;li&gt;페이스북, 인스타그램에서 사용자의 데이터에 접근할 수 있는 Access Token을 발급한다.&lt;/li&gt;
&lt;li&gt;네이버는 발급받은 Access Token을 가지고 페이스북,인스타그램 API 를 호출하여 사진데이터를 가져온다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;핵심 개념&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;OAuth 2.0의 역할&lt;/b&gt;:&lt;br /&gt;사용자(당신)의 민감한 로그인 정보(아이디/비밀번호)를 공유하지 않고도 naver.com이 페이스북, 인스타그램의 데이터를 가져올 수 있도록 안전한 방식으로 권한을 위임한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Access Token&lt;/b&gt;:&lt;br /&gt;페이스북, 인스타그램이 발급하는 &quot;권한 증명서&quot;로, 이를 통해 naver.com은 정해진 범위 내에서만 사용자의 데이터를 가져올 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;OIDC&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용 목적 : OIDC는 인증을 위해서 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를들어서 네이버에서 구글, 카카오로 로그인하고 싶은경우(가장 많이 사용하는 Authorization Code Flow로 설명)&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;네이버에 접속후 구글, 카카오로 로그인 버튼 클릭&lt;/li&gt;
&lt;li&gt;네이버는 구글, 카카오의 OIDC Authorization Endpoint로 Redirection 한다.&lt;/li&gt;
&lt;li&gt;구글, 카카오의 로그인 화면에서 계정과 비밀번호를 입력 후 scope(email, 이름, 등등...)에 접근할 수 있도록 승인한다.&lt;/li&gt;
&lt;li&gt;승인이 되면 Authorization Code를 발급하고 2번에서 Redirection 할때 파라미터로 넘긴 인증후 redirection URL로 redirection 시킨다.&lt;/li&gt;
&lt;li&gt;네이버 서버에서는 4번에서 받은 Authorization Code를 가지고 구글, 카카오의 Token Endpoint에 요청을 보내서 AccessToken, ID Token을 발급 받는다.&lt;/li&gt;
&lt;li&gt;네이버는 ID Token을 통해서 사용자의 정보를통해 네이버 계정을 생성하거나 세션을 생성한다.&lt;/li&gt;
&lt;li&gt;이과정을 통해 변도의 회원가입 절차 없이 사용자를 인증한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AccessToken : 사용자의 구글,카카오 리소스에 접근하기 위한 토큰&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ID Token : 사용자의 인증 정보가 포함된 JWT(위 과정중 3번 과정에 scope 에 명시한 데이터들이 들어있다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;OIDC를 사용해야하는 이유&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&quot;구글 로그인&quot;과 같은 소셜 로그인&lt;/b&gt;을 구현할 때.&lt;/li&gt;
&lt;li&gt;사용자의 인증을 간소화하고 중앙화된 인증 제공.&lt;/li&gt;
&lt;li&gt;OAuth 2.0으로 부족했던 인증(Authentication) 문제를 해결.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;OIDC vs OAuth2.0&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;OIDC&lt;/b&gt;는 주로 &lt;b&gt;사용자 인증&lt;/b&gt;(로그인)에 초점을 맞춘 프로토콜
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예: 구글 계정을 통해 네이버에 로그인.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;OAuth 2.0&lt;/b&gt;은 &lt;b&gt;권한 부여&lt;/b&gt;에 초점을 맞춘 프로토콜
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예: 네이버가 페이스북에서 사용자의 사진 데이터를 가져오는 것.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;OIDC의 장점&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;회원가입 없이 간편한 로그인&lt;/b&gt;:&lt;br /&gt;사용자는 별도로 회원가입하지 않아도 구글 계정을 통해 네이버에 로그인할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ID Token을 통한 사용자 정보 제공&lt;/b&gt;:&lt;br /&gt;ID Token에 사용자의 기본 정보(예: 이름, 이메일)가 포함되어 있어 추가적인 API 호출 없이 사용자 정보를 가져올 수 있다&lt;/li&gt;
&lt;li&gt;&lt;b&gt;표준 프로토콜 사용&lt;/b&gt;:&lt;br /&gt;OIDC는 전 세계적으로 사용되는 표준 프로토콜로, 다양한 서비스 간 호환이 쉽다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;OpenID Connect Discovery 1.0 Provider Metadata&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenID Connect 를 사용하기 위해 필요한 모든 엔드 포인트 및 공개 키 위치 정보를 포함 하여 OpenID 공급자의 구성에 대한 클레임 집합을 나타낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색 문서 경로 : ~/.well-known/openid-configuration&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;keycloak의 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://localhost:8080/realms/렐름명/.well-known/openid-configuration&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1310&quot; data-origin-height=&quot;975&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YNzR8/btsLOrY2aGI/ZL5zcJZQwnWYiTgDGk8ya1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YNzR8/btsLOrY2aGI/ZL5zcJZQwnWYiTgDGk8ya1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YNzR8/btsLOrY2aGI/ZL5zcJZQwnWYiTgDGk8ya1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYNzR8%2FbtsLOrY2aGI%2FZL5zcJZQwnWYiTgDGk8ya1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1310&quot; height=&quot;975&quot; data-origin-width=&quot;1310&quot; data-origin-height=&quot;975&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;references-및-사진-출처&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;References 및 사진 출처&lt;/h2&gt;
&lt;blockquote style=&quot;color: #000000; text-align: start;&quot; data-ke-style=&quot;style2&quot;&gt;정수원 스프링 시큐리티 OAuth2&lt;/blockquote&gt;</description>
      <category>Spring/Oauth2</category>
      <author>hwanguu</author>
      <guid isPermaLink="true">https://hwanguu.tistory.com/77</guid>
      <comments>https://hwanguu.tistory.com/77#entry77comment</comments>
      <pubDate>Thu, 16 Jan 2025 00:13:39 +0900</pubDate>
    </item>
    <item>
      <title>Oauth2 PKCE-enhanced Authorization Code Grant</title>
      <link>https://hwanguu.tistory.com/76</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;PKCE(Proof Key for Code Exchange, RFC - 6749) 개요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드 교환을 위한 증명 키로서 CSRF 및 권한부여코드 삽입 공격을 방지하기 위한 Authorization Code Grant Flow 의 확장버전이다.&amp;nbsp; &lt;/li&gt;
&lt;li&gt;권한부여코드 요청시 Code Verifier와 Code Challenge 를 추가하여 만약 Authorization Code Grant Flow 에서 Authrozization Code 가 탈취당했을 때 Access&amp;nbsp;Token을&amp;nbsp;발급하지&amp;nbsp;못하도록&amp;nbsp;차단한다. &lt;/li&gt;
&lt;li&gt;PKCE는 원래 모바일 앱에서 Authorization Code Grant Flow 를 보호하도록 설계되었으며 나중에 단일 페이지 앱에서도 사용하도록 권장되으며 모든 유형의OAuth2&amp;nbsp;클라이언트,&amp;nbsp;심지어&amp;nbsp;클라이언트&amp;nbsp;암호를&amp;nbsp;사용하는&amp;nbsp;웹&amp;nbsp;서버에서&amp;nbsp;실행되는&amp;nbsp;앱에도&amp;nbsp;유용하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드 생성&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1. Code Verifier
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;①&amp;nbsp;권한부여코드&amp;nbsp;요청&amp;nbsp;전에&amp;nbsp;앱이&amp;nbsp;원래&amp;nbsp;생성한&amp;nbsp;PKCE&amp;nbsp;요청에&amp;nbsp;대한&amp;nbsp;코드&amp;nbsp;검증기 &lt;/li&gt;
&lt;li&gt;②&amp;nbsp;48&amp;nbsp;~&amp;nbsp;128&amp;nbsp;글자수를&amp;nbsp;가진&amp;nbsp;무작위&amp;nbsp;문자열 &lt;/li&gt;
&lt;li&gt;③&amp;nbsp;A-Z&amp;nbsp;a-z&amp;nbsp;0-9&amp;nbsp;-._~&amp;nbsp;의&amp;nbsp;ASCII&amp;nbsp;문자들로만&amp;nbsp;구성됨 &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2.&amp;nbsp;Code&amp;nbsp;Challenge &lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;①&amp;nbsp;선택한&amp;nbsp;Hash&amp;nbsp;알고리즘으로&amp;nbsp;Code&amp;nbsp;Verifier를&amp;nbsp;Hashing&amp;nbsp;한&amp;nbsp;후&amp;nbsp;Base64&amp;nbsp;인코딩을&amp;nbsp;한&amp;nbsp;값 &lt;/li&gt;
&lt;li&gt;②&amp;nbsp;ex)&amp;nbsp;Base64Encode(Sha256(ASCII(Code&amp;nbsp;Verifier))) &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;3.&amp;nbsp;Code&amp;nbsp;Challenge&amp;nbsp;Method &lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;①&amp;nbsp;plain&amp;nbsp;&amp;ndash;&amp;nbsp;Code&amp;nbsp;Verifier&amp;nbsp;가&amp;nbsp;특정한&amp;nbsp;알고리즘을&amp;nbsp;사용하지&amp;nbsp;않도록&amp;nbsp;설정 &lt;/li&gt;
&lt;li&gt;②&amp;nbsp;S256&amp;nbsp;&amp;ndash;&amp;nbsp;Code&amp;nbsp;Verifier&amp;nbsp;해시&amp;nbsp;알고리즘&amp;nbsp;사용하도록&amp;nbsp;설정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;처리 흐름&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;클라이언트는 code_verifier를 생성하고, code_challenge_method를 사용하여 code_challenge를 계산한다.&lt;/li&gt;
&lt;li&gt;클라이언트가 /authorize에 대한 요청을 작성한다.&lt;/li&gt;
&lt;li&gt;권한 서버가 /authorize에 대한 표준 OAuth2 요청 유효성 검증을 수행한다.&lt;/li&gt;
&lt;li&gt;권한 서버가 code_challenge 및 code_challenge_method의 존재를 확인한다.&lt;/li&gt;
&lt;li&gt;권한 서버가 권한 코드에 대해 code_challenge 및 code_challenge_method를 저장한다.&lt;/li&gt;
&lt;li&gt;권한 서버가 권한 코드 응답을 리턴한다.&lt;/li&gt;
&lt;li&gt;클라이언트가 추가 code_verifier를 포함해 권한 코드를 /token에 제공한다.&lt;/li&gt;
&lt;li&gt;권한 서버가 /token에 대한 표준 OAuth2 요청 유효성 검증을 수행한다.&lt;/li&gt;
&lt;li&gt;권한 서버가 제공된 code_verifier 및 저장된 code_challenge_method를 사용하여 고유 code_challenge를 생성한다.&lt;/li&gt;
&lt;li&gt;권한 서버가 생성된 code_challenge를 /authorize에 대한 초기 요청에 제공된 값과 비교한다.&lt;/li&gt;
&lt;li&gt;두 값이 일치하면 액세스 토큰이 발행되고 일치하지 않으면 요청이 거부된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;code_challenge_method 검증&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;권한 부여 코드 흐름에 있어 인가서버는 code_verifier를 검증하기 위해 code_challenge_method 을 이미 알고 있어야 한다&lt;/li&gt;
&lt;li&gt;토큰 교환시 code_challenge_method 가 plain 이면 인가서버는 전달된 code_verifier 와 보관하고 있는 code_challenge 문자열과 단순히 일치하는지 확인만 하면 된다&lt;/li&gt;
&lt;li&gt;code_challenge_method 가 S256이면 인가서버는 전달된 code_verifier 를 가져와서 동일한 S256 해시 메소드를 사용하여 변환한 다음 보관된 code_challenge 문 자열과 비교해서 일치 여부를 판단한다&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;흐름&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1145&quot; data-origin-height=&quot;489&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcXMd6/btsLJCtnNIL/XIYbU4wD0yi3jxOACwbmU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcXMd6/btsLJCtnNIL/XIYbU4wD0yi3jxOACwbmU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcXMd6/btsLJCtnNIL/XIYbU4wD0yi3jxOACwbmU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcXMd6%2FbtsLJCtnNIL%2FXIYbU4wD0yi3jxOACwbmU1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1145&quot; height=&quot;489&quot; data-origin-width=&quot;1145&quot; data-origin-height=&quot;489&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1129&quot; data-origin-height=&quot;620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F3tfT/btsLJFwQC6Z/QHuKz2LKGHmRhPMk3oaHfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F3tfT/btsLJFwQC6Z/QHuKz2LKGHmRhPMk3oaHfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F3tfT/btsLJFwQC6Z/QHuKz2LKGHmRhPMk3oaHfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF3tfT%2FbtsLJFwQC6Z%2FQHuKz2LKGHmRhPMk3oaHfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1129&quot; height=&quot;620&quot; data-origin-width=&quot;1129&quot; data-origin-height=&quot;620&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실습&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;기본세팅 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://hwanguu.tistory.com/71&quot;&gt;https://hwanguu.tistory.com/71&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1736689587860&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Oauth2 Keycloak Docker compose, 기본세팅&quot; data-og-description=&quot;version: '3.9'services: postgres: image: postgres:latest container_name: postgres restart: always environment: POSTGRES_USER: keycloak POSTGRES_PASSWORD: keycloak POSTGRES_DB: keycloak ports: - &amp;quot;5432:5432&amp;quot; keycloak: image: quay.io/keycloak/keycloak:19.0.1 &quot; data-og-host=&quot;hwanguu.tistory.com&quot; data-og-source-url=&quot;https://hwanguu.tistory.com/71&quot; data-og-url=&quot;https://hwanguu.tistory.com/71&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/z7LKM/hyX0kFHr4u/CMLiBUD7HTPWkBWuK2318k/img.png?width=800&amp;amp;height=411&amp;amp;face=0_0_800_411,https://scrap.kakaocdn.net/dn/Ngohx/hyX0vNZRla/tHjjDcIFgSSS1sT3bVZeu0/img.png?width=800&amp;amp;height=411&amp;amp;face=0_0_800_411,https://scrap.kakaocdn.net/dn/beDoVV/hyX0ycRW3X/SbGgfJzMWgvAOULYuFBTik/img.png?width=1348&amp;amp;height=694&amp;amp;face=0_0_1348_694&quot;&gt;&lt;a href=&quot;https://hwanguu.tistory.com/71&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hwanguu.tistory.com/71&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/z7LKM/hyX0kFHr4u/CMLiBUD7HTPWkBWuK2318k/img.png?width=800&amp;amp;height=411&amp;amp;face=0_0_800_411,https://scrap.kakaocdn.net/dn/Ngohx/hyX0vNZRla/tHjjDcIFgSSS1sT3bVZeu0/img.png?width=800&amp;amp;height=411&amp;amp;face=0_0_800_411,https://scrap.kakaocdn.net/dn/beDoVV/hyX0ycRW3X/SbGgfJzMWgvAOULYuFBTik/img.png?width=1348&amp;amp;height=694&amp;amp;face=0_0_1348_694');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Oauth2 Keycloak Docker compose, 기본세팅&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;version: '3.9'services: postgres: image: postgres:latest container_name: postgres restart: always environment: POSTGRES_USER: keycloak POSTGRES_PASSWORD: keycloak POSTGRES_DB: keycloak ports: - &quot;5432:5432&quot; keycloak: image: quay.io/keycloak/keycloak:19.0.1&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hwanguu.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212121; text-align: left;&quot;&gt;code_challenge_method : plain 방식&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212121; text-align: left;&quot;&gt;1. code_challenge 생성&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212121; text-align: left;&quot;&gt;&lt;a href=&quot;https://tonyxu-io.github.io/pkce-generator/&quot;&gt;https://tonyxu-io.github.io/pkce-generator/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;963&quot; data-origin-height=&quot;573&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1DKx1/btsLMbAz3HL/hDNz3IajEAYmn7qxo66PK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1DKx1/btsLMbAz3HL/hDNz3IajEAYmn7qxo66PK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1DKx1/btsLMbAz3HL/hDNz3IajEAYmn7qxo66PK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1DKx1%2FbtsLMbAz3HL%2FhDNz3IajEAYmn7qxo66PK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;963&quot; height=&quot;573&quot; data-origin-width=&quot;963&quot; data-origin-height=&quot;573&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;span style=&quot;color: #212121;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;Generate Code Verifier 클릭 후 Generate Code Challenge 클릭&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #212121;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;Code Challenge 를 복사한후 아래 url 중 code_challenge= 에 붙여넣는다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212121; text-align: left;&quot;&gt;localhost:8080/realms/oauth2/protocol/openid-connect/auth?response_type=code&amp;amp;client_id=oauth2-client-app&amp;amp;scope=profile email&amp;amp;redirect_uri=http://localhost:8081&amp;amp;code_challenge='여기'&amp;amp;code_challenge_method=plain&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #212121;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;ex) &lt;span style=&quot;background-color: #ffffff; color: #212121; text-align: left;&quot;&gt;localhost:8080/realms/oauth2/protocol/openid-connect/auth?response_type=code&amp;amp;client_id=oauth2-client-app&amp;amp;scope=profile email&amp;amp;redirect_uri=http://localhost:8081&amp;amp;code_challenge=&lt;b&gt;-nwsnaOQV3nY8ikTvUSoB8Zm00Z-jfTE9w3bmoGeOqo&lt;/b&gt;&amp;amp;code_challenge_method=plain&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212121; text-align: left;&quot;&gt;2. &lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;인증 서버 로그인&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1413&quot; data-origin-height=&quot;706&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfouYt/btsLK52alGB/ZbyecpAYbCXrgoxI9wSdd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfouYt/btsLK52alGB/ZbyecpAYbCXrgoxI9wSdd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfouYt/btsLK52alGB/ZbyecpAYbCXrgoxI9wSdd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfouYt%2FbtsLK52alGB%2FZbyecpAYbCXrgoxI9wSdd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1413&quot; height=&quot;706&quot; data-origin-width=&quot;1413&quot; data-origin-height=&quot;706&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;3. 로그인 성공시 return 값 확인&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1333&quot; data-origin-height=&quot;43&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cw7cn0/btsLMrwoyh6/nAbW1kovG9TAycEHSfVk11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cw7cn0/btsLMrwoyh6/nAbW1kovG9TAycEHSfVk11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cw7cn0/btsLMrwoyh6/nAbW1kovG9TAycEHSfVk11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcw7cn0%2FbtsLMrwoyh6%2FnAbW1kovG9TAycEHSfVk11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1333&quot; height=&quot;43&quot; data-origin-width=&quot;1333&quot; data-origin-height=&quot;43&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212121; text-align: left;&quot;&gt;http://localhost:8081/?session_state=21b71827-9d9a-4390-93c8-050df234cc03&amp;amp;code=&lt;b&gt;0ae64686-af05-49dc-b1bc-4f0e18367f1f.21b71827-9d9a-4390-93c8-050df234cc03.a86f1300-5de6-4970-b889-a72430531df5&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212121; text-align: left;&quot;&gt;4. code 값을 통해서 token 요청&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212121; text-align: left;&quot;&gt; &lt;span style=&quot;background-color: #ffffff; color: #212121; text-align: start;&quot;&gt;Code Verifier&lt;/span&gt; 는 1번에서 생성된 &lt;span style=&quot;background-color: #ffffff; color: #212121; text-align: start;&quot;&gt;Code Challenge&lt;/span&gt; 를 넣는다. (plain 이기때문에 Code Challenge와 Code Verifier가 같다)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;731&quot; data-origin-height=&quot;377&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dSDYCJ/btsLKFWYfL1/uwbt5EkVXrBU9xGdqt73zK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dSDYCJ/btsLKFWYfL1/uwbt5EkVXrBU9xGdqt73zK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dSDYCJ/btsLKFWYfL1/uwbt5EkVXrBU9xGdqt73zK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdSDYCJ%2FbtsLKFWYfL1%2Fuwbt5EkVXrBU9xGdqt73zK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;731&quot; height=&quot;377&quot; data-origin-width=&quot;731&quot; data-origin-height=&quot;377&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212121; text-align: left;&quot;&gt;5. return 값 확인&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1736690309557&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
    &quot;access_token&quot;: &quot;eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJqOXYyeTNJN0RzTy02aFhqanFGUi1YSURWd2RvWUwyemRfVjN3c05EREFZIn0.eyJleHAiOjE3MzY2OTA1MjgsImlhdCI6MTczNjY5MDIyOCwiYXV0aF90aW1lIjoxNzM2NjkwMjAzLCJqdGkiOiJhN2ZkNTk0ZS1iMGVlLTQ5YmQtODI4Yy03MGNmMTUwYWFhYjMiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL29hdXRoMiIsImF1ZCI6ImFjY291bnQiLCJzdWIiOiJiN2JmNzk5OC01Yzk4LTQ4NmItOTdiYi1iODMwMzc0MGRkYjciLCJ0eXAiOiJCZWFyZXIiLCJhenAiOiJvYXV0aDItY2xpZW50LWFwcCIsInNlc3Npb25fc3RhdGUiOiIyMWI3MTgyNy05ZDlhLTQzOTAtOTNjOC0wNTBkZjIzNGNjMDMiLCJhY3IiOiIxIiwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iLCJkZWZhdWx0LXJvbGVzLW9hdXRoMiJdfSwicmVzb3VyY2VfYWNjZXNzIjp7ImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYWNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoiZW1haWwgcHJvZmlsZSIsInNpZCI6IjIxYjcxODI3LTlkOWEtNDM5MC05M2M4LTA1MGRmMjM0Y2MwMyIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwibmFtZSI6ImNob2kgc2Vod2FuIiwicHJlZmVycmVkX3VzZXJuYW1lIjoidXNlciIsImdpdmVuX25hbWUiOiJjaG9pIiwiZmFtaWx5X25hbWUiOiJzZWh3YW4iLCJlbWFpbCI6InVzZXJAbmF2ZXIuY29tIn0.ObuIvS3s33Q7Nffc2vs-Z2OgSHYdKcvjKGUV6KEdyouhCecNVzoI0OexuIjHKszmwj7mXMUogjY3aOduMg7HBo3cIQLmwoTzASXdGrGfODlIEmLYUr8emZc6RGO9MsXxBW9YhPlX7OBvGwTtj_Qwte1d-qPy3Q7H-bsK7mH0AEQa1vs9e4cYhGOiPQBkK9Tzh4dDSDDL98WzDs1sfjPYiBHSW9E1OQ3bQf1-M_4_yJSRikJUE0HLt9w-vg3cHyQkvvOshJ4Bd_aCecS_lzS6B8CtIIxTjE-jAfkNUEe44uA3WXOXo_HXPhCQZz2wSnbO6U6Fhl0d3BXD7bB4VJeU4w&quot;,
    &quot;expires_in&quot;: 300,
    &quot;refresh_expires_in&quot;: 1800,
    &quot;refresh_token&quot;: &quot;eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI4NWNmMTZkNS04OWY1LTQxY2EtOWQ4ZS1hMjZiODFiMGVmNjgifQ.eyJleHAiOjE3MzY2OTIwMjgsImlhdCI6MTczNjY5MDIyOCwianRpIjoiYzg4NDk4ZTgtNThlYy00MGY0LTgyNmEtMjQ5NjEwNjkzNDMwIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy9vYXV0aDIiLCJhdWQiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL29hdXRoMiIsInN1YiI6ImI3YmY3OTk4LTVjOTgtNDg2Yi05N2JiLWI4MzAzNzQwZGRiNyIsInR5cCI6IlJlZnJlc2giLCJhenAiOiJvYXV0aDItY2xpZW50LWFwcCIsInNlc3Npb25fc3RhdGUiOiIyMWI3MTgyNy05ZDlhLTQzOTAtOTNjOC0wNTBkZjIzNGNjMDMiLCJzY29wZSI6ImVtYWlsIHByb2ZpbGUiLCJzaWQiOiIyMWI3MTgyNy05ZDlhLTQzOTAtOTNjOC0wNTBkZjIzNGNjMDMifQ.LBwnKxOWjKNxgLsi7AbvkimhJUps4YP8fc5dyhJ5zs8&quot;,
    &quot;token_type&quot;: &quot;Bearer&quot;,
    &quot;not-before-policy&quot;: 0,
    &quot;session_state&quot;: &quot;21b71827-9d9a-4390-93c8-050df234cc03&quot;,
    &quot;scope&quot;: &quot;email profile&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212121; text-align: left;&quot;&gt;code_challenge_method : s256 방식&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212121; text-align: left;&quot;&gt;&lt;a href=&quot;https://tonyxu-io.github.io/pkce-generator/&quot;&gt;https://tonyxu-io.github.io/pkce-generator/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;561&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PFoUb/btsLLBfoxUn/rPdT0RUHSp9Rq6rCKlOtPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PFoUb/btsLLBfoxUn/rPdT0RUHSp9Rq6rCKlOtPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PFoUb/btsLLBfoxUn/rPdT0RUHSp9Rq6rCKlOtPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPFoUb%2FbtsLLBfoxUn%2FrPdT0RUHSp9Rq6rCKlOtPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;968&quot; height=&quot;561&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;561&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;Generate Code Verifier 클릭 후 Generate Code Challenge 클릭&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;Code Challenge 를 복사한후 아래 url 중 code_challenge= 에 붙여넣는다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;ex)&lt;span&gt; &lt;span style=&quot;background-color: #ffffff; color: #212121; text-align: left;&quot;&gt;localhost:8080/realms/oauth2/protocol/openid-connect/auth?response_type=code&amp;amp;client_id=oauth2-client-app&amp;amp;scope=profile email&amp;amp;redirect_uri=http://localhost:8081&amp;amp;code_challenge=&lt;b&gt;YoHoXkH143cNcFIqGhSr2mMpLEEbu_cxOmS_6zwGmKY&lt;/b&gt;&amp;amp;code_challenge_method=S256&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212121; text-align: left;&quot;&gt;2.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;인증 서버 로그인&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1413&quot; data-origin-height=&quot;706&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfouYt/btsLK52alGB/ZbyecpAYbCXrgoxI9wSdd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfouYt/btsLK52alGB/ZbyecpAYbCXrgoxI9wSdd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfouYt/btsLK52alGB/ZbyecpAYbCXrgoxI9wSdd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfouYt%2FbtsLK52alGB%2FZbyecpAYbCXrgoxI9wSdd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1413&quot; height=&quot;706&quot; data-origin-width=&quot;1413&quot; data-origin-height=&quot;706&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;3. 로그인 성공시 return 값 확인&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1320&quot; data-origin-height=&quot;31&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bn6W1T/btsLKcgEyWu/y0AFflVP1SgQdaM1LGEce0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bn6W1T/btsLKcgEyWu/y0AFflVP1SgQdaM1LGEce0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bn6W1T/btsLKcgEyWu/y0AFflVP1SgQdaM1LGEce0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbn6W1T%2FbtsLKcgEyWu%2Fy0AFflVP1SgQdaM1LGEce0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1320&quot; height=&quot;31&quot; data-origin-width=&quot;1320&quot; data-origin-height=&quot;31&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;http://localhost:8081/?session_state=21b71827-9d9a-4390-93c8-050df234cc03&amp;amp;code=&lt;b&gt;8e1fc7d7-6f05-4919-9223-123ed6ba5bac.21b71827-9d9a-4390-93c8-050df234cc03.a86f1300-5de6-4970-b889-a72430531df5&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212121; text-align: left;&quot;&gt;4. code 값을 통해서 token 요청&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212121; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212121; text-align: start;&quot;&gt;Code Verifier&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;는 1번에서 생성된 code_verifier를 넣는다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;725&quot; data-origin-height=&quot;388&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYLMhC/btsLKtbo4ok/wppNIXKDHV2vcpEkIvELRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYLMhC/btsLKtbo4ok/wppNIXKDHV2vcpEkIvELRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYLMhC/btsLKtbo4ok/wppNIXKDHV2vcpEkIvELRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYLMhC%2FbtsLKtbo4ok%2FwppNIXKDHV2vcpEkIvELRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;725&quot; height=&quot;388&quot; data-origin-width=&quot;725&quot; data-origin-height=&quot;388&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212121; text-align: left;&quot;&gt;5. return 값 확인&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1736691174087&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
    &quot;access_token&quot;: &quot;eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJqOXYyeTNJN0RzTy02aFhqanFGUi1YSURWd2RvWUwyemRfVjN3c05EREFZIn0.eyJleHAiOjE3MzY2OTEzNzQsImlhdCI6MTczNjY5MTA3NCwiYXV0aF90aW1lIjoxNzM2NjkwMjAzLCJqdGkiOiI5ODFjMzMwYi0yMTUyLTRmM2ItOWViOC00NWQxNmRmM2NmZWIiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL29hdXRoMiIsImF1ZCI6ImFjY291bnQiLCJzdWIiOiJiN2JmNzk5OC01Yzk4LTQ4NmItOTdiYi1iODMwMzc0MGRkYjciLCJ0eXAiOiJCZWFyZXIiLCJhenAiOiJvYXV0aDItY2xpZW50LWFwcCIsInNlc3Npb25fc3RhdGUiOiIyMWI3MTgyNy05ZDlhLTQzOTAtOTNjOC0wNTBkZjIzNGNjMDMiLCJhY3IiOiIwIiwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iLCJkZWZhdWx0LXJvbGVzLW9hdXRoMiJdfSwicmVzb3VyY2VfYWNjZXNzIjp7ImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYWNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoiZW1haWwgcHJvZmlsZSIsInNpZCI6IjIxYjcxODI3LTlkOWEtNDM5MC05M2M4LTA1MGRmMjM0Y2MwMyIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwibmFtZSI6ImNob2kgc2Vod2FuIiwicHJlZmVycmVkX3VzZXJuYW1lIjoidXNlciIsImdpdmVuX25hbWUiOiJjaG9pIiwiZmFtaWx5X25hbWUiOiJzZWh3YW4iLCJlbWFpbCI6InVzZXJAbmF2ZXIuY29tIn0.M64EDsBoom-7jwbfduFdKBxSWtWLkM8bQk9L8kmuN1p-HLNNsPZX5FFatNenGDntUrHVRrUPKhKoaR3Epw8rKIdfIHS3jhSKD0mYE2OmSFSr9cLbAAkVgFPfdLbUzz83EeOb9u-U76fkxBW24RmBbrVN3-T21HZJTw_jhZUUker-cNbmZfocuB4MXykqgG50ZQXxzL8cY8p8usx7aSqCB6lgGicL4gTzknewuk_wnKir_m4n6jCmGz7WuEalhhwUiAv4pxZ_tTkdEpv7ibgQSC_-Ky0M8Ss3YVW3CGxy1KFvwHNtwPrSpOO2oEvju9-JcCKUVh6_1tMNlaXLTjxZ4g&quot;,
    &quot;expires_in&quot;: 300,
    &quot;refresh_expires_in&quot;: 1800,
    &quot;refresh_token&quot;: &quot;eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI4NWNmMTZkNS04OWY1LTQxY2EtOWQ4ZS1hMjZiODFiMGVmNjgifQ.eyJleHAiOjE3MzY2OTI4NzQsImlhdCI6MTczNjY5MTA3NCwianRpIjoiNzRhNDI1N2ItOGI5Mi00MjJhLTg5MWMtNzdiMjNlZTFiOGQzIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy9vYXV0aDIiLCJhdWQiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL29hdXRoMiIsInN1YiI6ImI3YmY3OTk4LTVjOTgtNDg2Yi05N2JiLWI4MzAzNzQwZGRiNyIsInR5cCI6IlJlZnJlc2giLCJhenAiOiJvYXV0aDItY2xpZW50LWFwcCIsInNlc3Npb25fc3RhdGUiOiIyMWI3MTgyNy05ZDlhLTQzOTAtOTNjOC0wNTBkZjIzNGNjMDMiLCJzY29wZSI6ImVtYWlsIHByb2ZpbGUiLCJzaWQiOiIyMWI3MTgyNy05ZDlhLTQzOTAtOTNjOC0wNTBkZjIzNGNjMDMifQ.SGVtJStd5d4Ak2_cDN1HIQ9o2X1fkVyRSN9SOvuYGCk&quot;,
    &quot;token_type&quot;: &quot;Bearer&quot;,
    &quot;not-before-policy&quot;: 0,
    &quot;session_state&quot;: &quot;21b71827-9d9a-4390-93c8-050df234cc03&quot;,
    &quot;scope&quot;: &quot;email profile&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;references-및-사진-출처&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;References 및 사진 출처&lt;/h2&gt;
&lt;blockquote style=&quot;color: #000000; text-align: start;&quot; data-ke-style=&quot;style2&quot;&gt;정수원 스프링 시큐리티 OAuth2&lt;/blockquote&gt;</description>
      <category>Spring/Oauth2</category>
      <author>hwanguu</author>
      <guid isPermaLink="true">https://hwanguu.tistory.com/76</guid>
      <comments>https://hwanguu.tistory.com/76#entry76comment</comments>
      <pubDate>Sun, 12 Jan 2025 23:13:16 +0900</pubDate>
    </item>
    <item>
      <title>Oauth2 Refresh Token Grant</title>
      <link>https://hwanguu.tistory.com/75</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;개요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1. 흐름 및 특징
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;액세스 토큰이 발급될 때 함께 제공되는 토큰으로서 액세스 토큰이 만료되더라도 함께 발급받았던 리프레시 토큰이 유효하다면, 인증 과정을 처음부터 반복하지 않아도 액세스 토큰을 재발급 받을수 있다.&lt;/li&gt;
&lt;li&gt;한&amp;nbsp;번&amp;nbsp;사용된&amp;nbsp;리프레시&amp;nbsp;토큰은&amp;nbsp;폐기되거나&amp;nbsp;재사용&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있다 &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2.&amp;nbsp;권한&amp;nbsp;부여&amp;nbsp;승인&amp;nbsp;요청&amp;nbsp;시&amp;nbsp;매개변수 &lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;grant_type=refresh_token&amp;nbsp;(필수) &lt;/li&gt;
&lt;li&gt;refresh_token &lt;/li&gt;
&lt;li&gt;client_id&amp;nbsp;(필수) &lt;/li&gt;
&lt;li&gt;client_secret&amp;nbsp;(필수)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;흐름&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1114&quot; data-origin-height=&quot;552&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rb7Rq/btsLKapzE6U/pNi1UnYsnk8SXru3bqA6S0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rb7Rq/btsLKapzE6U/pNi1UnYsnk8SXru3bqA6S0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rb7Rq/btsLKapzE6U/pNi1UnYsnk8SXru3bqA6S0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frb7Rq%2FbtsLKapzE6U%2FpNi1UnYsnk8SXru3bqA6S0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1114&quot; height=&quot;552&quot; data-origin-width=&quot;1114&quot; data-origin-height=&quot;552&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;654&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgo19O/btsLJ8SWdNu/On0pZjIuS2hYPvUj3YFiyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgo19O/btsLJ8SWdNu/On0pZjIuS2hYPvUj3YFiyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgo19O/btsLJ8SWdNu/On0pZjIuS2hYPvUj3YFiyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcgo19O%2FbtsLJ8SWdNu%2FOn0pZjIuS2hYPvUj3YFiyk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1006&quot; height=&quot;654&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;654&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;실습&lt;/h2&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;기본세팅 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://hwanguu.tistory.com/71&quot;&gt;https://hwanguu.tistory.com/71&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1736688791467&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Oauth2 Keycloak Docker compose, 기본세팅&quot; data-og-description=&quot;version: '3.9'services: postgres: image: postgres:latest container_name: postgres restart: always environment: POSTGRES_USER: keycloak POSTGRES_PASSWORD: keycloak POSTGRES_DB: keycloak ports: - &amp;quot;5432:5432&amp;quot; keycloak: image: quay.io/keycloak/keycloak:19.0.1 &quot; data-og-host=&quot;hwanguu.tistory.com&quot; data-og-source-url=&quot;https://hwanguu.tistory.com/71&quot; data-og-url=&quot;https://hwanguu.tistory.com/71&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/z7LKM/hyX0kFHr4u/CMLiBUD7HTPWkBWuK2318k/img.png?width=800&amp;amp;height=411&amp;amp;face=0_0_800_411,https://scrap.kakaocdn.net/dn/Ngohx/hyX0vNZRla/tHjjDcIFgSSS1sT3bVZeu0/img.png?width=800&amp;amp;height=411&amp;amp;face=0_0_800_411,https://scrap.kakaocdn.net/dn/beDoVV/hyX0ycRW3X/SbGgfJzMWgvAOULYuFBTik/img.png?width=1348&amp;amp;height=694&amp;amp;face=0_0_1348_694&quot;&gt;&lt;a href=&quot;https://hwanguu.tistory.com/71&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hwanguu.tistory.com/71&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/z7LKM/hyX0kFHr4u/CMLiBUD7HTPWkBWuK2318k/img.png?width=800&amp;amp;height=411&amp;amp;face=0_0_800_411,https://scrap.kakaocdn.net/dn/Ngohx/hyX0vNZRla/tHjjDcIFgSSS1sT3bVZeu0/img.png?width=800&amp;amp;height=411&amp;amp;face=0_0_800_411,https://scrap.kakaocdn.net/dn/beDoVV/hyX0ycRW3X/SbGgfJzMWgvAOULYuFBTik/img.png?width=1348&amp;amp;height=694&amp;amp;face=0_0_1348_694');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Oauth2 Keycloak Docker compose, 기본세팅&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;version: '3.9'services: postgres: image: postgres:latest container_name: postgres restart: always environment: POSTGRES_USER: keycloak POSTGRES_PASSWORD: keycloak POSTGRES_DB: keycloak ports: - &quot;5432:5432&quot; keycloak: image: quay.io/keycloak/keycloak:19.0.1&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hwanguu.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Authorization Grant, Password Grant 실행후 refresh_token을 받는다. 아래 링크 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;a href=&quot;https://hwanguu.tistory.com/70&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://hwanguu.tistory.com/70&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1736688856131&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Oauth2 Authorization Code Grant&quot; data-og-description=&quot;개요&amp;nbsp;1. 흐름 및 특징1) 사용자가 애플리케이션을 승인하면 인가서버는 Redirect URI 로 임시 코드 담아서 애플리케이션으로 다시 리다이렉션한다2) 애플리케이션은 해당 임시 코드를 인가서버로 &quot; data-og-host=&quot;hwanguu.tistory.com&quot; data-og-source-url=&quot;https://hwanguu.tistory.com/70&quot; data-og-url=&quot;https://hwanguu.tistory.com/70&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eJHRKF/hyX0nJd34y/71DoDyzu7vbWKMSb48m2e0/img.png?width=800&amp;amp;height=299&amp;amp;face=0_0_800_299,https://scrap.kakaocdn.net/dn/Spr00/hyX0sDKjFe/kifBLrve6ncVe4WQd3k9tK/img.png?width=800&amp;amp;height=299&amp;amp;face=0_0_800_299,https://scrap.kakaocdn.net/dn/b569W4/hyX0o2paTA/9rKDiEyPBQwiWinQXOPj7K/img.png?width=1442&amp;amp;height=720&amp;amp;face=0_0_1442_720&quot;&gt;&lt;a href=&quot;https://hwanguu.tistory.com/70&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hwanguu.tistory.com/70&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eJHRKF/hyX0nJd34y/71DoDyzu7vbWKMSb48m2e0/img.png?width=800&amp;amp;height=299&amp;amp;face=0_0_800_299,https://scrap.kakaocdn.net/dn/Spr00/hyX0sDKjFe/kifBLrve6ncVe4WQd3k9tK/img.png?width=800&amp;amp;height=299&amp;amp;face=0_0_800_299,https://scrap.kakaocdn.net/dn/b569W4/hyX0o2paTA/9rKDiEyPBQwiWinQXOPj7K/img.png?width=1442&amp;amp;height=720&amp;amp;face=0_0_1442_720');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Oauth2 Authorization Code Grant&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;개요&amp;nbsp;1. 흐름 및 특징1) 사용자가 애플리케이션을 승인하면 인가서버는 Redirect URI 로 임시 코드 담아서 애플리케이션으로 다시 리다이렉션한다2) 애플리케이션은 해당 임시 코드를 인가서버로&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hwanguu.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;a href=&quot;https://hwanguu.tistory.com/73&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://hwanguu.tistory.com/73&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1736688967475&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Oauth2 Password Grant&quot; data-og-description=&quot;개요1. 흐름 및 특징애플리케이션이 사용자 이름과 암호를 액세스 토큰으로 교환할 때 사용된다.타사 어플리케이션이 이 권한을 사용하도록 허용해서는 안되고 고도의 신뢰할 자사 어플리케이&quot; data-og-host=&quot;hwanguu.tistory.com&quot; data-og-source-url=&quot;https://hwanguu.tistory.com/73&quot; data-og-url=&quot;https://hwanguu.tistory.com/73&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/vp2p2/hyX0lxRgJ8/SvKE7BjFy058Pqs8gK1qvk/img.png?width=800&amp;amp;height=403&amp;amp;face=0_0_800_403,https://scrap.kakaocdn.net/dn/UjpAP/hyX0vmUJIR/AlUksRkN8QW2t1wEmKcOSK/img.png?width=800&amp;amp;height=403&amp;amp;face=0_0_800_403,https://scrap.kakaocdn.net/dn/qNLlu/hyX0zXaJWS/ArwEtbe8XnSCMTDmbvGrT1/img.png?width=1144&amp;amp;height=658&amp;amp;face=0_0_1144_658&quot;&gt;&lt;a href=&quot;https://hwanguu.tistory.com/73&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hwanguu.tistory.com/73&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/vp2p2/hyX0lxRgJ8/SvKE7BjFy058Pqs8gK1qvk/img.png?width=800&amp;amp;height=403&amp;amp;face=0_0_800_403,https://scrap.kakaocdn.net/dn/UjpAP/hyX0vmUJIR/AlUksRkN8QW2t1wEmKcOSK/img.png?width=800&amp;amp;height=403&amp;amp;face=0_0_800_403,https://scrap.kakaocdn.net/dn/qNLlu/hyX0zXaJWS/ArwEtbe8XnSCMTDmbvGrT1/img.png?width=1144&amp;amp;height=658&amp;amp;face=0_0_1144_658');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Oauth2 Password Grant&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;개요1. 흐름 및 특징애플리케이션이 사용자 이름과 암호를 액세스 토큰으로 교환할 때 사용된다.타사 어플리케이션이 이 권한을 사용하도록 허용해서는 안되고 고도의 신뢰할 자사 어플리케이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hwanguu.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. refresh_token을 통해서 API 요청&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;580&quot; data-origin-height=&quot;289&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brrcsU/btsLK1Meu7i/EtnkfSooKXppOycKjJyoV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brrcsU/btsLK1Meu7i/EtnkfSooKXppOycKjJyoV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brrcsU/btsLK1Meu7i/EtnkfSooKXppOycKjJyoV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrrcsU%2FbtsLK1Meu7i%2FEtnkfSooKXppOycKjJyoV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;580&quot; height=&quot;289&quot; data-origin-width=&quot;580&quot; data-origin-height=&quot;289&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. return 값 확인&lt;/p&gt;
&lt;pre id=&quot;code_1736688937997&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
    &quot;access_token&quot;: &quot;eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJqOXYyeTNJN0RzTy02aFhqanFGUi1YSURWd2RvWUwyemRfVjN3c05EREFZIn0.eyJleHAiOjE3MzY2ODkyMjYsImlhdCI6MTczNjY4ODkyNiwianRpIjoiOWNhOTNmNmQtMTUwMC00OTBkLWI4OTAtNDYzY2NhNjg0YzQ0IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy9vYXV0aDIiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiYjdiZjc5OTgtNWM5OC00ODZiLTk3YmItYjgzMDM3NDBkZGI3IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoib2F1dGgyLWNsaWVudC1hcHAiLCJzZXNzaW9uX3N0YXRlIjoiZjllOWJiNDgtZDQwMy00NzMyLWJhN2ItNzc0MjEyMWRkMzMzIiwiYWNyIjoiMSIsInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIiwiZGVmYXVsdC1yb2xlcy1vYXV0aDIiXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6ImVtYWlsIHByb2ZpbGUiLCJzaWQiOiJmOWU5YmI0OC1kNDAzLTQ3MzItYmE3Yi03NzQyMTIxZGQzMzMiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsIm5hbWUiOiJjaG9pIHNlaHdhbiIsInByZWZlcnJlZF91c2VybmFtZSI6InVzZXIiLCJnaXZlbl9uYW1lIjoiY2hvaSIsImZhbWlseV9uYW1lIjoic2Vod2FuIiwiZW1haWwiOiJ1c2VyQG5hdmVyLmNvbSJ9.Arl4E3WcfwikwC_xn5W6oXvKYnoI_kvRFqmpI93UkMdB_vDluos5VEA6RRofxjXpeT7cChVPHr-6MD_Z6_X6eLY1UaiJWqCaZrKUGfMLy9cRQ4BpCWJnxpVjbC76O5-0U8xDucUzQxdzxS5LSmIPrg-ojDsmB0BMkPVQDaYkW7oS6AGbCSQ11n6RlpYuQEH2WeTBIoSGREahMVqyBElzB4s1hypcPPtNzGrIThpGqIV4W_jWdUHb_KzRsKRNeNkAD7C561jsntMHp88WIsqv2QsvHPrK60wWriBPEwJWLU7-AlkeHu3G8ytZnI1IvgzK-qz3xb7PAEPSC772_sPJSg&quot;,
    &quot;expires_in&quot;: 300,
    &quot;refresh_expires_in&quot;: 1800,
    &quot;refresh_token&quot;: &quot;eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI4NWNmMTZkNS04OWY1LTQxY2EtOWQ4ZS1hMjZiODFiMGVmNjgifQ.eyJleHAiOjE3MzY2OTA3MjYsImlhdCI6MTczNjY4ODkyNiwianRpIjoiYjFhZjljNGYtMDcwMC00NzQwLTk5YTAtMjUyNTYyMjcwMzI1IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy9vYXV0aDIiLCJhdWQiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL29hdXRoMiIsInN1YiI6ImI3YmY3OTk4LTVjOTgtNDg2Yi05N2JiLWI4MzAzNzQwZGRiNyIsInR5cCI6IlJlZnJlc2giLCJhenAiOiJvYXV0aDItY2xpZW50LWFwcCIsInNlc3Npb25fc3RhdGUiOiJmOWU5YmI0OC1kNDAzLTQ3MzItYmE3Yi03NzQyMTIxZGQzMzMiLCJzY29wZSI6ImVtYWlsIHByb2ZpbGUiLCJzaWQiOiJmOWU5YmI0OC1kNDAzLTQ3MzItYmE3Yi03NzQyMTIxZGQzMzMifQ.kiH6Ik6xTPnDtmvAGYTZwn5nRp2l6W7k4FObFNmWmX8&quot;,
    &quot;token_type&quot;: &quot;Bearer&quot;,
    &quot;not-before-policy&quot;: 0,
    &quot;session_state&quot;: &quot;f9e9bb48-d403-4732-ba7b-7742121dd333&quot;,
    &quot;scope&quot;: &quot;email profile&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;references-및-사진-출처&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;References 및 사진 출처&lt;/h2&gt;
&lt;blockquote style=&quot;color: #000000; text-align: start;&quot; data-ke-style=&quot;style2&quot;&gt;정수원 스프링 시큐리티 OAuth2&lt;/blockquote&gt;</description>
      <category>Spring/Oauth2</category>
      <author>hwanguu</author>
      <guid isPermaLink="true">https://hwanguu.tistory.com/75</guid>
      <comments>https://hwanguu.tistory.com/75#entry75comment</comments>
      <pubDate>Sun, 12 Jan 2025 22:36:14 +0900</pubDate>
    </item>
    <item>
      <title>Oauth2 Client Credentials Grant</title>
      <link>https://hwanguu.tistory.com/74</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;개요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1. 흐름 및 특징
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;애플리케이션이 리소스 소유자인 동시에 클라이언트의 역할을 한다&lt;/li&gt;
&lt;li&gt;리소스 소유자에게 권한 위임 받아 리소스에 접근하는 것이 아니라 자기 자신이 애플리케이션을 사용할 목적으로 사용하는 것&lt;/li&gt;
&lt;li&gt;서버 대 서버간의 통신에서 사용할 수 있으며 IOT 와 같은 장비 어플리케이션과의 통신을 위한 인증으로도 사용할 수 있다.&lt;/li&gt;
&lt;li&gt;Client Id 와 Client Secret 을 통해 액세스 토큰을 바로 발급 받을 수 있기 때문에 Refresh Token 을 제공하지 않는다&lt;/li&gt;
&lt;li&gt;Client 정보를 기반으로 하기 때문에 사용자 정보를 제공하지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2.&amp;nbsp;권한&amp;nbsp;부여&amp;nbsp;승인&amp;nbsp;요청&amp;nbsp;시&amp;nbsp;매개변수 &lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;grant_type=client_credentials (필수) &lt;/li&gt;
&lt;li&gt;client_id (필수) &lt;/li&gt;
&lt;li&gt;client_secret (필수) &lt;/li&gt;
&lt;li&gt;scope (선택사항)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흐름&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1105&quot; data-origin-height=&quot;460&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvfv0v/btsLKvmKHaR/t7aYMKofqSTKbqLvjj8GHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvfv0v/btsLKvmKHaR/t7aYMKofqSTKbqLvjj8GHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvfv0v/btsLKvmKHaR/t7aYMKofqSTKbqLvjj8GHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbvfv0v%2FbtsLKvmKHaR%2Ft7aYMKofqSTKbqLvjj8GHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1105&quot; height=&quot;460&quot; data-origin-width=&quot;1105&quot; data-origin-height=&quot;460&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1011&quot; data-origin-height=&quot;655&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9peCK/btsLJD6TLYi/D9K3Fy54Dq26PwepsYumlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9peCK/btsLJD6TLYi/D9K3Fy54Dq26PwepsYumlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9peCK/btsLJD6TLYi/D9K3Fy54Dq26PwepsYumlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9peCK%2FbtsLJD6TLYi%2FD9K3Fy54Dq26PwepsYumlK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1011&quot; height=&quot;655&quot; data-origin-width=&quot;1011&quot; data-origin-height=&quot;655&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;실습&lt;/h2&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;기본세팅 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://hwanguu.tistory.com/71&quot;&gt;https://hwanguu.tistory.com/71&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1736688560716&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Oauth2 Keycloak Docker compose, 기본세팅&quot; data-og-description=&quot;version: '3.9'services: postgres: image: postgres:latest container_name: postgres restart: always environment: POSTGRES_USER: keycloak POSTGRES_PASSWORD: keycloak POSTGRES_DB: keycloak ports: - &amp;quot;5432:5432&amp;quot; keycloak: image: quay.io/keycloak/keycloak:19.0.1 &quot; data-og-host=&quot;hwanguu.tistory.com&quot; data-og-source-url=&quot;https://hwanguu.tistory.com/71&quot; data-og-url=&quot;https://hwanguu.tistory.com/71&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/z7LKM/hyX0kFHr4u/CMLiBUD7HTPWkBWuK2318k/img.png?width=800&amp;amp;height=411&amp;amp;face=0_0_800_411,https://scrap.kakaocdn.net/dn/Ngohx/hyX0vNZRla/tHjjDcIFgSSS1sT3bVZeu0/img.png?width=800&amp;amp;height=411&amp;amp;face=0_0_800_411,https://scrap.kakaocdn.net/dn/beDoVV/hyX0ycRW3X/SbGgfJzMWgvAOULYuFBTik/img.png?width=1348&amp;amp;height=694&amp;amp;face=0_0_1348_694&quot;&gt;&lt;a href=&quot;https://hwanguu.tistory.com/71&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hwanguu.tistory.com/71&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/z7LKM/hyX0kFHr4u/CMLiBUD7HTPWkBWuK2318k/img.png?width=800&amp;amp;height=411&amp;amp;face=0_0_800_411,https://scrap.kakaocdn.net/dn/Ngohx/hyX0vNZRla/tHjjDcIFgSSS1sT3bVZeu0/img.png?width=800&amp;amp;height=411&amp;amp;face=0_0_800_411,https://scrap.kakaocdn.net/dn/beDoVV/hyX0ycRW3X/SbGgfJzMWgvAOULYuFBTik/img.png?width=1348&amp;amp;height=694&amp;amp;face=0_0_1348_694');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Oauth2 Keycloak Docker compose, 기본세팅&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;version: '3.9'services: postgres: image: postgres:latest container_name: postgres restart: always environment: POSTGRES_USER: keycloak POSTGRES_PASSWORD: keycloak POSTGRES_DB: keycloak ports: - &quot;5432:5432&quot; keycloak: image: quay.io/keycloak/keycloak:19.0.1&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hwanguu.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;인증 서버 API 호출&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;573&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QyZl2/btsLJFcupNg/JKYvmb78we7fKVjhJQ4Sm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QyZl2/btsLJFcupNg/JKYvmb78we7fKVjhJQ4Sm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QyZl2/btsLJFcupNg/JKYvmb78we7fKVjhJQ4Sm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQyZl2%2FbtsLJFcupNg%2FJKYvmb78we7fKVjhJQ4Sm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;573&quot; height=&quot;288&quot; data-origin-width=&quot;573&quot; data-origin-height=&quot;288&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. return 값 확인&lt;/p&gt;
&lt;pre id=&quot;code_1736688606428&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
    &quot;access_token&quot;: &quot;eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJqOXYyeTNJN0RzTy02aFhqanFGUi1YSURWd2RvWUwyemRfVjN3c05EREFZIn0.eyJleHAiOjE3MzY2ODg4OTYsImlhdCI6MTczNjY4ODU5NiwianRpIjoiMzYwNmY5ZWMtZjI1ZS00Y2QxLWJhZmMtODc1MWYyMWI4OGUwIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy9vYXV0aDIiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiZjgyMjMyNWEtN2YzZS00Y2U0LThkZGItNDg5ZTkyZDA1MjU5IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoib2F1dGgyLWNsaWVudC1hcHAiLCJhY3IiOiIxIiwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iLCJkZWZhdWx0LXJvbGVzLW9hdXRoMiJdfSwicmVzb3VyY2VfYWNjZXNzIjp7Im9hdXRoMi1jbGllbnQtYXBwIjp7InJvbGVzIjpbInVtYV9wcm90ZWN0aW9uIl19LCJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6ImVtYWlsIHByb2ZpbGUiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsImNsaWVudEhvc3QiOiIxNzIuMjAuMC4xIiwiY2xpZW50SWQiOiJvYXV0aDItY2xpZW50LWFwcCIsInByZWZlcnJlZF91c2VybmFtZSI6InNlcnZpY2UtYWNjb3VudC1vYXV0aDItY2xpZW50LWFwcCIsImNsaWVudEFkZHJlc3MiOiIxNzIuMjAuMC4xIn0.RYnPt8QPMLX1cjFeHzXkXLH0ZYYBrSt4DaWluTPfZCagafhYAkP_kTTcAjgfc5lDHRjm6jt0GsHZHr0K_z7jN3r4_uvwoLnCSAFvp5dLbXuZAGMcG3wa8nURBElM-_b99Fx-YWYwcE4nMEzrcN-SIkxArz4BPW71qjTlihbNyzCsgoNKVLsjX6yTkCRDmsU-BHfWroSLaCGT5UE3vPsnNHrUOCIy7bOooG-KB71l4NHSV_wvI6oBeW-rbENtIMc8kLlk15VU2QFS5iA9fbSh8be-ckfL2u6gesaJ4W-TBDle7ydMSH3nuplUT065oTMnJbTBN1gT50VZpZqaZfpKYw&quot;,
    &quot;expires_in&quot;: 300,
    &quot;refresh_expires_in&quot;: 0,
    &quot;token_type&quot;: &quot;Bearer&quot;,
    &quot;not-before-policy&quot;: 0,
    &quot;scope&quot;: &quot;email profile&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;references-및-사진-출처&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;References 및 사진 출처&lt;/h2&gt;
&lt;blockquote style=&quot;color: #000000; text-align: start;&quot; data-ke-style=&quot;style2&quot;&gt;정수원 스프링 시큐리티 OAuth2&lt;/blockquote&gt;</description>
      <category>Spring/Oauth2</category>
      <author>hwanguu</author>
      <guid isPermaLink="true">https://hwanguu.tistory.com/74</guid>
      <comments>https://hwanguu.tistory.com/74#entry74comment</comments>
      <pubDate>Sun, 12 Jan 2025 22:30:41 +0900</pubDate>
    </item>
    <item>
      <title>Oauth2 Password Grant</title>
      <link>https://hwanguu.tistory.com/73</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;개요&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1. 흐름 및 특징
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;애플리케이션이 사용자 이름과 암호를 액세스 토큰으로 교환할 때 사용된다.&lt;/li&gt;
&lt;li&gt;타사 어플리케이션이 이 권한을 사용하도록 허용해서는 안되고 고도의 신뢰할 자사 어플리케이션에서만 사용해야 한다. (어플리케이션이 사용자의 ID, PW를 알수있기 때문에 신뢰할수 있는 어플리케이션에 사용해야함)&lt;/li&gt;
&lt;li&gt;ID, PW를 어플리케이션이 인가서버로 보내야 하기 때문에 Back Channel 에서 사용해야한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2. 권한 부여 승인 요청 시 매개변수
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;grant_type=password (필수)&lt;/li&gt;
&lt;li&gt;username (필수)&lt;/li&gt;
&lt;li&gt;password (필수)&lt;/li&gt;
&lt;li&gt;client_id (필수)&lt;/li&gt;
&lt;li&gt;client_secret (필수)&lt;/li&gt;
&lt;li&gt;scope (선택사항)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흐름&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1141&quot; data-origin-height=&quot;575&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s1JHi/btsLMofoRZg/6du3ztPc8eTOD1UXcFI8eK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s1JHi/btsLMofoRZg/6du3ztPc8eTOD1UXcFI8eK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s1JHi/btsLMofoRZg/6du3ztPc8eTOD1UXcFI8eK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs1JHi%2FbtsLMofoRZg%2F6du3ztPc8eTOD1UXcFI8eK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1141&quot; height=&quot;575&quot; data-origin-width=&quot;1141&quot; data-origin-height=&quot;575&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1144&quot; data-origin-height=&quot;658&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpj0Jb/btsLLCeiIFQ/gOw3kiSlKyNd6hKsNvMWyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpj0Jb/btsLLCeiIFQ/gOw3kiSlKyNd6hKsNvMWyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpj0Jb/btsLLCeiIFQ/gOw3kiSlKyNd6hKsNvMWyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbpj0Jb%2FbtsLLCeiIFQ%2FgOw3kiSlKyNd6hKsNvMWyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1144&quot; height=&quot;658&quot; data-origin-width=&quot;1144&quot; data-origin-height=&quot;658&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;실습&lt;/h2&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;기본세팅 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://hwanguu.tistory.com/71&quot;&gt;https://hwanguu.tistory.com/71&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1736688296692&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Oauth2 Keycloak Docker compose, 기본세팅&quot; data-og-description=&quot;version: '3.9'services: postgres: image: postgres:latest container_name: postgres restart: always environment: POSTGRES_USER: keycloak POSTGRES_PASSWORD: keycloak POSTGRES_DB: keycloak ports: - &amp;quot;5432:5432&amp;quot; keycloak: image: quay.io/keycloak/keycloak:19.0.1 &quot; data-og-host=&quot;hwanguu.tistory.com&quot; data-og-source-url=&quot;https://hwanguu.tistory.com/71&quot; data-og-url=&quot;https://hwanguu.tistory.com/71&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/z7LKM/hyX0kFHr4u/CMLiBUD7HTPWkBWuK2318k/img.png?width=800&amp;amp;height=411&amp;amp;face=0_0_800_411,https://scrap.kakaocdn.net/dn/Ngohx/hyX0vNZRla/tHjjDcIFgSSS1sT3bVZeu0/img.png?width=800&amp;amp;height=411&amp;amp;face=0_0_800_411,https://scrap.kakaocdn.net/dn/beDoVV/hyX0ycRW3X/SbGgfJzMWgvAOULYuFBTik/img.png?width=1348&amp;amp;height=694&amp;amp;face=0_0_1348_694&quot;&gt;&lt;a href=&quot;https://hwanguu.tistory.com/71&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hwanguu.tistory.com/71&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/z7LKM/hyX0kFHr4u/CMLiBUD7HTPWkBWuK2318k/img.png?width=800&amp;amp;height=411&amp;amp;face=0_0_800_411,https://scrap.kakaocdn.net/dn/Ngohx/hyX0vNZRla/tHjjDcIFgSSS1sT3bVZeu0/img.png?width=800&amp;amp;height=411&amp;amp;face=0_0_800_411,https://scrap.kakaocdn.net/dn/beDoVV/hyX0ycRW3X/SbGgfJzMWgvAOULYuFBTik/img.png?width=1348&amp;amp;height=694&amp;amp;face=0_0_1348_694');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Oauth2 Keycloak Docker compose, 기본세팅&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;version: '3.9'services: postgres: image: postgres:latest container_name: postgres restart: always environment: POSTGRES_USER: keycloak POSTGRES_PASSWORD: keycloak POSTGRES_DB: keycloak ports: - &quot;5432:5432&quot; keycloak: image: quay.io/keycloak/keycloak:19.0.1&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hwanguu.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;1. 인증 서버 API 호출&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;359&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cn21NV/btsLLAAPf2G/EWaczrD6OZfXaMBv2tEwYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cn21NV/btsLLAAPf2G/EWaczrD6OZfXaMBv2tEwYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cn21NV/btsLLAAPf2G/EWaczrD6OZfXaMBv2tEwYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcn21NV%2FbtsLLAAPf2G%2FEWaczrD6OZfXaMBv2tEwYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;622&quot; height=&quot;359&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;359&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;2. return 값 확인&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1736688356995&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
    &quot;access_token&quot;: &quot;eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJqOXYyeTNJN0RzTy02aFhqanFGUi1YSURWd2RvWUwyemRfVjN3c05EREFZIn0.eyJleHAiOjE3MzY2ODg2MTYsImlhdCI6MTczNjY4ODMxNiwianRpIjoiODI3YjlkMzMtOGU2YS00YTlkLTk2ZGItZjAwMDY2M2U0YTE2IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy9vYXV0aDIiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiYjdiZjc5OTgtNWM5OC00ODZiLTk3YmItYjgzMDM3NDBkZGI3IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoib2F1dGgyLWNsaWVudC1hcHAiLCJzZXNzaW9uX3N0YXRlIjoiZjllOWJiNDgtZDQwMy00NzMyLWJhN2ItNzc0MjEyMWRkMzMzIiwiYWNyIjoiMSIsInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIiwiZGVmYXVsdC1yb2xlcy1vYXV0aDIiXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6ImVtYWlsIHByb2ZpbGUiLCJzaWQiOiJmOWU5YmI0OC1kNDAzLTQ3MzItYmE3Yi03NzQyMTIxZGQzMzMiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsIm5hbWUiOiJjaG9pIHNlaHdhbiIsInByZWZlcnJlZF91c2VybmFtZSI6InVzZXIiLCJnaXZlbl9uYW1lIjoiY2hvaSIsImZhbWlseV9uYW1lIjoic2Vod2FuIiwiZW1haWwiOiJ1c2VyQG5hdmVyLmNvbSJ9.dKXHs3hNUPR_JgX4XYTEde3MHdjht8A4D3StlKLUGvNq_embsGFKBaT2YhT16I5m5qmR4-FZadAbsNP1RETu-g27mZrdOHRyrHs5JPlomikwlLADLTUv10M2miluWmEQbTne3ReYdSPKmeU6d450PXC7cY5-6SwV794sIkG90m6i7V1wFucVdm8YEyOl2PRDlNgfqBIw50UcDgEtlg9jOfhs5SRmAtOeIfmYmFKXYoyfN1M-TiCm-Vm_6XP38uVdjQmDRPNj_x6osc0fv88gHOtdoXYzub4JD57xzIQ1Mlp-ftP8ut8QUYULh5oBjbKjxGz7cyTKo75ShTh8liDh8g&quot;,
    &quot;expires_in&quot;: 300,
    &quot;refresh_expires_in&quot;: 1800,
    &quot;refresh_token&quot;: &quot;eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI4NWNmMTZkNS04OWY1LTQxY2EtOWQ4ZS1hMjZiODFiMGVmNjgifQ.eyJleHAiOjE3MzY2OTAxMTYsImlhdCI6MTczNjY4ODMxNiwianRpIjoiN2VlNzgxN2EtOTk5Ny00ZDNhLWJkYTEtZDVmZTcxYzBlMjRlIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy9vYXV0aDIiLCJhdWQiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL29hdXRoMiIsInN1YiI6ImI3YmY3OTk4LTVjOTgtNDg2Yi05N2JiLWI4MzAzNzQwZGRiNyIsInR5cCI6IlJlZnJlc2giLCJhenAiOiJvYXV0aDItY2xpZW50LWFwcCIsInNlc3Npb25fc3RhdGUiOiJmOWU5YmI0OC1kNDAzLTQ3MzItYmE3Yi03NzQyMTIxZGQzMzMiLCJzY29wZSI6ImVtYWlsIHByb2ZpbGUiLCJzaWQiOiJmOWU5YmI0OC1kNDAzLTQ3MzItYmE3Yi03NzQyMTIxZGQzMzMifQ.T62gCwem9Hb7W4zhRfF-c6ss6S8jyccJamT7tRBTWoI&quot;,
    &quot;token_type&quot;: &quot;Bearer&quot;,
    &quot;not-before-policy&quot;: 0,
    &quot;session_state&quot;: &quot;f9e9bb48-d403-4732-ba7b-7742121dd333&quot;,
    &quot;scope&quot;: &quot;email profile&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;references-및-사진-출처&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;References 및 사진 출처&lt;/h2&gt;
&lt;blockquote style=&quot;color: #000000; text-align: start;&quot; data-ke-style=&quot;style2&quot;&gt;정수원 스프링 시큐리티 OAuth2&lt;/blockquote&gt;</description>
      <category>Spring/Oauth2</category>
      <author>hwanguu</author>
      <guid isPermaLink="true">https://hwanguu.tistory.com/73</guid>
      <comments>https://hwanguu.tistory.com/73#entry73comment</comments>
      <pubDate>Sun, 12 Jan 2025 22:26:14 +0900</pubDate>
    </item>
    <item>
      <title>Oauth2 Implicit Grant</title>
      <link>https://hwanguu.tistory.com/72</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;개요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1. 흐름 및 특징
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클라이언트에서 Javascript 및 HTML 소스 코드를 다운로드한 후 브라우저는 서비스에 직접 API 요청을 한다&lt;/li&gt;
&lt;li&gt;코드 교환 단계를 건너뛰고 대신 액세스 토큰이 쿼리 문자열 조각으로 클라이언트에 즉시 반환됩니다.&lt;/li&gt;
&lt;li&gt;이 유형은 back channel 이 없으므로 refresh token 을 사용하지 못한다.&lt;/li&gt;
&lt;li&gt;토큰 만료 시 어플리케이션이 새로운 access token을 얻으려면 다시 OAuth 승인 과정을 거쳐야 한다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2. 권한 부여 승인 요청 시 매개변수
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;response_type=token (필수), id_token&lt;/li&gt;
&lt;li&gt;client_id (필수)&lt;/li&gt;
&lt;li&gt;redirect_uri (필수)&lt;/li&gt;
&lt;li&gt;scope (선택사항)&lt;/li&gt;
&lt;li&gt;state (선택사항)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흐름&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1231&quot; data-origin-height=&quot;561&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKN4o3/btsLKIe79qh/DbPWPhimKrLgvKKfXeFzIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKN4o3/btsLKIe79qh/DbPWPhimKrLgvKKfXeFzIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKN4o3/btsLKIe79qh/DbPWPhimKrLgvKKfXeFzIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKN4o3%2FbtsLKIe79qh%2FDbPWPhimKrLgvKKfXeFzIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1231&quot; height=&quot;561&quot; data-origin-width=&quot;1231&quot; data-origin-height=&quot;561&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1190&quot; data-origin-height=&quot;653&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wA5tm/btsLLRvxiPW/PkNIM7BKdr4EqGqlqIC1wk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wA5tm/btsLLRvxiPW/PkNIM7BKdr4EqGqlqIC1wk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wA5tm/btsLLRvxiPW/PkNIM7BKdr4EqGqlqIC1wk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwA5tm%2FbtsLLRvxiPW%2FPkNIM7BKdr4EqGqlqIC1wk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1190&quot; height=&quot;653&quot; data-origin-width=&quot;1190&quot; data-origin-height=&quot;653&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실습&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;기본세팅 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://hwanguu.tistory.com/71&quot;&gt;https://hwanguu.tistory.com/71&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1736687837039&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Oauth2 Keycloak Docker compose, 기본세팅&quot; data-og-description=&quot;version: '3.9'services: postgres: image: postgres:latest container_name: postgres restart: always environment: POSTGRES_USER: keycloak POSTGRES_PASSWORD: keycloak POSTGRES_DB: keycloak ports: - &amp;quot;5432:5432&amp;quot; keycloak: image: quay.io/keycloak/keycloak:19.0.1 &quot; data-og-host=&quot;hwanguu.tistory.com&quot; data-og-source-url=&quot;https://hwanguu.tistory.com/71&quot; data-og-url=&quot;https://hwanguu.tistory.com/71&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/z7LKM/hyX0kFHr4u/CMLiBUD7HTPWkBWuK2318k/img.png?width=800&amp;amp;height=411&amp;amp;face=0_0_800_411,https://scrap.kakaocdn.net/dn/Ngohx/hyX0vNZRla/tHjjDcIFgSSS1sT3bVZeu0/img.png?width=800&amp;amp;height=411&amp;amp;face=0_0_800_411,https://scrap.kakaocdn.net/dn/beDoVV/hyX0ycRW3X/SbGgfJzMWgvAOULYuFBTik/img.png?width=1348&amp;amp;height=694&amp;amp;face=0_0_1348_694&quot;&gt;&lt;a href=&quot;https://hwanguu.tistory.com/71&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hwanguu.tistory.com/71&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/z7LKM/hyX0kFHr4u/CMLiBUD7HTPWkBWuK2318k/img.png?width=800&amp;amp;height=411&amp;amp;face=0_0_800_411,https://scrap.kakaocdn.net/dn/Ngohx/hyX0vNZRla/tHjjDcIFgSSS1sT3bVZeu0/img.png?width=800&amp;amp;height=411&amp;amp;face=0_0_800_411,https://scrap.kakaocdn.net/dn/beDoVV/hyX0ycRW3X/SbGgfJzMWgvAOULYuFBTik/img.png?width=1348&amp;amp;height=694&amp;amp;face=0_0_1348_694');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Oauth2 Keycloak Docker compose, 기본세팅&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;version: '3.9'services: postgres: image: postgres:latest container_name: postgres restart: always environment: POSTGRES_USER: keycloak POSTGRES_PASSWORD: keycloak POSTGRES_DB: keycloak ports: - &quot;5432:5432&quot; keycloak: image: quay.io/keycloak/keycloak:19.0.1&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hwanguu.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;url :&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212121; text-align: left;&quot;&gt;localhost:8080/realms/oauth2/protocol/openid-connect/auth?response_type=token&amp;amp;client_id=oauth2-client-app&amp;amp;scope=profile email&amp;amp;redirect_uri=http://localhost:8081&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1. 인증 서버 로그인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1270&quot; data-origin-height=&quot;686&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biPDp0/btsLLq52qe6/ib0VlLKkRif5qzER4IoFY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biPDp0/btsLLq52qe6/ib0VlLKkRif5qzER4IoFY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biPDp0/btsLLq52qe6/ib0VlLKkRif5qzER4IoFY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiPDp0%2FbtsLLq52qe6%2Fib0VlLKkRif5qzER4IoFY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1270&quot; height=&quot;686&quot; data-origin-width=&quot;1270&quot; data-origin-height=&quot;686&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. 로그인 성공시 return 값 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1552&quot; data-origin-height=&quot;35&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzh191/btsLKqTjA0J/x9OgJB34SE81ExSjZ0BBzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzh191/btsLKqTjA0J/x9OgJB34SE81ExSjZ0BBzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzh191/btsLKqTjA0J/x9OgJB34SE81ExSjZ0BBzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbzh191%2FbtsLKqTjA0J%2Fx9OgJB34SE81ExSjZ0BBzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1552&quot; height=&quot;35&quot; data-origin-width=&quot;1552&quot; data-origin-height=&quot;35&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1736687900706&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;http://localhost:8081/#session_state=b38f19ec-9200-4743-ad46-86aef56cbd68&amp;amp;access_token=eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJqOXYyeTNJN0RzTy02aFhqanFGUi1YSURWd2RvWUwyemRfVjN3c05EREFZIn0.eyJleHAiOjE3MzY2ODg3NzIsImlhdCI6MTczNjY4Nzg3MiwiYXV0aF90aW1lIjoxNzM2Njg3ODcyLCJqdGkiOiI1OThkY2QxNC1jYTgxLTQwNDctODE2YS1mYTA3NWY1MzU3Y2IiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL29hdXRoMiIsImF1ZCI6ImFjY291bnQiLCJzdWIiOiJiN2JmNzk5OC01Yzk4LTQ4NmItOTdiYi1iODMwMzc0MGRkYjciLCJ0eXAiOiJCZWFyZXIiLCJhenAiOiJvYXV0aDItY2xpZW50LWFwcCIsInNlc3Npb25fc3RhdGUiOiJiMzhmMTllYy05MjAwLTQ3NDMtYWQ0Ni04NmFlZjU2Y2JkNjgiLCJhY3IiOiIxIiwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iLCJkZWZhdWx0LXJvbGVzLW9hdXRoMiJdfSwicmVzb3VyY2VfYWNjZXNzIjp7ImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYWNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoiZW1haWwgcHJvZmlsZSIsInNpZCI6ImIzOGYxOWVjLTkyMDAtNDc0My1hZDQ2LTg2YWVmNTZjYmQ2OCIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwibmFtZSI6ImNob2kgc2Vod2FuIiwicHJlZmVycmVkX3VzZXJuYW1lIjoidXNlciIsImdpdmVuX25hbWUiOiJjaG9pIiwiZmFtaWx5X25hbWUiOiJzZWh3YW4iLCJlbWFpbCI6InVzZXJAbmF2ZXIuY29tIn0.uXeewCZwE4DLMatLm3z4KfPUvOyDlX2OGWmHsugns8kOe-FgZKxC1-AykZad57ZkxPf9c215DON-0rUuQhC_uV9-0TPg5IYhzaDHSfNC2xTlXPdPZmvZHq78K1EW-I9vo-zWuPENBpwTWz2TInO49vnSYCtGwkoPao6zzmrUYf5tO5yIEOcDg9HFPI-edCglZimCRMfWkec0HYOdPdH-GyRpRz3JFQL9j1rPa8DKoLzneU5PAFK9ipV_jFliNnIuQf8XjpWhpwqwSYm6FoGzx3rvW8XyVdVqchf9KzeZcU8uxR3x-olEfiCczrnWG486dF_9sxUjkIYcLcT9TRLFHA&amp;amp;token_type=Bearer&amp;amp;expires_in=900&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;return 값으로 access_token이 바로 반환된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;refresh_token은 없다. access_token 만료시 다시 implicit 인증을 해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;references-및-사진-출처&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;References 및 사진 출처&lt;/h2&gt;
&lt;blockquote style=&quot;color: #000000; text-align: start;&quot; data-ke-style=&quot;style2&quot;&gt;정수원 스프링 시큐리티 OAuth2&lt;/blockquote&gt;</description>
      <category>Spring/Oauth2</category>
      <author>hwanguu</author>
      <guid isPermaLink="true">https://hwanguu.tistory.com/72</guid>
      <comments>https://hwanguu.tistory.com/72#entry72comment</comments>
      <pubDate>Sun, 12 Jan 2025 22:19:45 +0900</pubDate>
    </item>
    <item>
      <title>Oauth2 Keycloak Docker compose, 기본세팅</title>
      <link>https://hwanguu.tistory.com/71</link>
      <description>&lt;pre id=&quot;code_1736685914672&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;version: '3.9'

services:
  postgres:
    image: postgres:latest
    container_name: postgres
    restart: always
    environment:
      POSTGRES_USER: keycloak
      POSTGRES_PASSWORD: keycloak
      POSTGRES_DB: keycloak
    ports:
      - &quot;5432:5432&quot;

  keycloak:
    image: quay.io/keycloak/keycloak:19.0.1
    container_name: keycloak
    restart: always
    environment:
      KEYCLOAK_ADMIN: admin
      KEYCLOAK_ADMIN_PASSWORD: admin
      KC_DB: postgres
      KC_DB_URL: jdbc:postgresql://postgres:5432/keycloak
      KC_DB_USERNAME: keycloak
      KC_DB_PASSWORD: keycloak
    ports:
      - &quot;8080:8080&quot;
    depends_on:
      - postgres
    command: start-dev&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;keycloak admin ID PW : admin&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;url : localhost:8080&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 어드민 콘솔 진입&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1348&quot; data-origin-height=&quot;694&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQlMyK/btsLMlXhxPo/OqnNJ3ogChDKUYknyvmNkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQlMyK/btsLMlXhxPo/OqnNJ3ogChDKUYknyvmNkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQlMyK/btsLMlXhxPo/OqnNJ3ogChDKUYknyvmNkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQlMyK%2FbtsLMlXhxPo%2FOqnNJ3ogChDKUYknyvmNkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1348&quot; height=&quot;694&quot; data-origin-width=&quot;1348&quot; data-origin-height=&quot;694&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 로그인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;ID : admin&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;PW : admin&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 렐름 생성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;353&quot; data-origin-height=&quot;352&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7DgYk/btsLMce8Vvr/SfeJ7IQOBoUA7VD8uoH8g1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7DgYk/btsLMce8Vvr/SfeJ7IQOBoUA7VD8uoH8g1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7DgYk/btsLMce8Vvr/SfeJ7IQOBoUA7VD8uoH8g1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7DgYk%2FbtsLMce8Vvr%2FSfeJ7IQOBoUA7VD8uoH8g1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;353&quot; height=&quot;352&quot; data-origin-width=&quot;353&quot; data-origin-height=&quot;352&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1058&quot; data-origin-height=&quot;696&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O7Zuo/btsLKnWASSV/4DSVyHwemHmCbqOCwV9xfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O7Zuo/btsLKnWASSV/4DSVyHwemHmCbqOCwV9xfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O7Zuo/btsLKnWASSV/4DSVyHwemHmCbqOCwV9xfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO7Zuo%2FbtsLKnWASSV%2F4DSVyHwemHmCbqOCwV9xfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1058&quot; height=&quot;696&quot; data-origin-width=&quot;1058&quot; data-origin-height=&quot;696&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. client id 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjqiAb/btsLKbotXp3/lnmqJofVKzOs86qbxDtuSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjqiAb/btsLKbotXp3/lnmqJofVKzOs86qbxDtuSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjqiAb/btsLKbotXp3/lnmqJofVKzOs86qbxDtuSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjqiAb%2FbtsLKbotXp3%2FlnmqJofVKzOs86qbxDtuSk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1112&quot; height=&quot;362&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;362&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1057&quot; data-origin-height=&quot;753&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZqciF/btsLKEjq6N1/jqBFKkP8SjFdPpbluIDrG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZqciF/btsLKEjq6N1/jqBFKkP8SjFdPpbluIDrG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZqciF/btsLKEjq6N1/jqBFKkP8SjFdPpbluIDrG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZqciF%2FbtsLKEjq6N1%2FjqBFKkP8SjFdPpbluIDrG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1057&quot; height=&quot;753&quot; data-origin-width=&quot;1057&quot; data-origin-height=&quot;753&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1184&quot; data-origin-height=&quot;747&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdSIBA/btsLMbUO7M9/KcjTOtYdh72hEhFodUXZM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdSIBA/btsLMbUO7M9/KcjTOtYdh72hEhFodUXZM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdSIBA/btsLMbUO7M9/KcjTOtYdh72hEhFodUXZM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdSIBA%2FbtsLMbUO7M9%2FKcjTOtYdh72hEhFodUXZM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1184&quot; height=&quot;747&quot; data-origin-width=&quot;1184&quot; data-origin-height=&quot;747&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. client id secret_key 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1184&quot; data-origin-height=&quot;691&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O7ikV/btsLMcsFGE3/DhID0X8xqXEhnWpUG4rq8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O7ikV/btsLMcsFGE3/DhID0X8xqXEhnWpUG4rq8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O7ikV/btsLMcsFGE3/DhID0X8xqXEhnWpUG4rq8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO7ikV%2FbtsLMcsFGE3%2FDhID0X8xqXEhnWpUG4rq8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1184&quot; height=&quot;691&quot; data-origin-width=&quot;1184&quot; data-origin-height=&quot;691&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1680&quot; data-origin-height=&quot;659&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EnXRU/btsLLTz6rz4/G319M8zwYgMgvUfmEeF4W1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EnXRU/btsLLTz6rz4/G319M8zwYgMgvUfmEeF4W1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EnXRU/btsLLTz6rz4/G319M8zwYgMgvUfmEeF4W1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEnXRU%2FbtsLLTz6rz4%2FG319M8zwYgMgvUfmEeF4W1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1680&quot; height=&quot;659&quot; data-origin-width=&quot;1680&quot; data-origin-height=&quot;659&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. user 등록&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;905&quot; data-origin-height=&quot;538&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coI4wr/btsLKMBKNan/D2HNoVkxjN7974XY9QrXVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coI4wr/btsLKMBKNan/D2HNoVkxjN7974XY9QrXVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coI4wr/btsLKMBKNan/D2HNoVkxjN7974XY9QrXVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoI4wr%2FbtsLKMBKNan%2FD2HNoVkxjN7974XY9QrXVk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;905&quot; height=&quot;538&quot; data-origin-width=&quot;905&quot; data-origin-height=&quot;538&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1183&quot; data-origin-height=&quot;838&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cid49y/btsLJvuipTp/K76CVz7pz4tfhJ9xPwwTBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cid49y/btsLJvuipTp/K76CVz7pz4tfhJ9xPwwTBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cid49y/btsLJvuipTp/K76CVz7pz4tfhJ9xPwwTBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcid49y%2FbtsLJvuipTp%2FK76CVz7pz4tfhJ9xPwwTBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1183&quot; height=&quot;838&quot; data-origin-width=&quot;1183&quot; data-origin-height=&quot;838&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. 생성한 유저로 로그인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://localhost:8080/realms/oauth2/account/#/&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1855&quot; data-origin-height=&quot;542&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6zmaF/btsLJxyN0cF/rhcISSkzIHiB2KJVZVuQP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6zmaF/btsLJxyN0cF/rhcISSkzIHiB2KJVZVuQP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6zmaF/btsLJxyN0cF/rhcISSkzIHiB2KJVZVuQP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6zmaF%2FbtsLJxyN0cF%2FrhcISSkzIHiB2KJVZVuQP0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1855&quot; height=&quot;542&quot; data-origin-width=&quot;1855&quot; data-origin-height=&quot;542&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;OpenID Connect 를 사용하기 위해 필요한 모든 엔드 포인트 및 공개 키 위치 정보&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1026&quot; data-origin-height=&quot;842&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4Hdqg/btsLJFwP3Vu/xdkaVZrtMxMjVu1Nhrt9j0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4Hdqg/btsLJFwP3Vu/xdkaVZrtMxMjVu1Nhrt9j0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4Hdqg/btsLJFwP3Vu/xdkaVZrtMxMjVu1Nhrt9j0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4Hdqg%2FbtsLJFwP3Vu%2FxdkaVZrtMxMjVu1Nhrt9j0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1026&quot; height=&quot;842&quot; data-origin-width=&quot;1026&quot; data-origin-height=&quot;842&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OIDC&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://localhost:8080/realms/'렐름명'/.well-known/openid-configuration&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) http://localhost:8080/realms/oauth2/.well-known/openid-configuration&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SAML&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://localhost:8080/realms/'렐름명'/protocol/saml/descriptor&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) http://localhost:8080/realms/oauth2/protocol/saml/descriptor&lt;/p&gt;</description>
      <category>Spring/Oauth2</category>
      <author>hwanguu</author>
      <guid isPermaLink="true">https://hwanguu.tistory.com/71</guid>
      <comments>https://hwanguu.tistory.com/71#entry71comment</comments>
      <pubDate>Sun, 12 Jan 2025 21:54:13 +0900</pubDate>
    </item>
    <item>
      <title>Oauth2 Authorization Code Grant</title>
      <link>https://hwanguu.tistory.com/70</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;개요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1. 흐름 및 특징
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1) 사용자가 애플리케이션을 승인하면 인가서버는 Redirect URI 로 임시 코드 담아서 애플리케이션으로 다시 리다이렉션한다&lt;/li&gt;
&lt;li&gt;2) 애플리케이션은 해당 임시 코드를 인가서버로 전달하고 액세스 토큰으로 교환한다&lt;/li&gt;
&lt;li&gt;3) 애플리케이션이 액세스 토큰을 요청할 때 해당 요청을 클라이언트 암호로 인증할 수 있으므로 공격자가 인증 코드를 가로채서 스스로 사용할 위험이 줄어듬&lt;/li&gt;
&lt;li&gt;4) 액세스 토큰이 사용자 또는 브라우저에 표시되지 않고 애플리케이션에 다시 전달하는 가장 안전한 방법이므로 토큰이 다른 사람에게 누출될 위험이 줄어듬&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2. 권한부여코드 요청 시 매개변수
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;uri : &lt;span style=&quot;background-color: #ffffff; color: #212121; text-align: left;&quot;&gt;/realms/'realm 명'/protocol/openid-connect/auth GET&lt;/span&gt; (keycloak 기준)&amp;nbsp;&lt;/li&gt;
&lt;li&gt;response_type=code (필수)&lt;/li&gt;
&lt;li&gt;client_id (필수)&lt;/li&gt;
&lt;li&gt;redirect_uri (선택사항)&lt;/li&gt;
&lt;li&gt;scope (선택사항)&lt;/li&gt;
&lt;li&gt;state (선택사항)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;3. 액세스토큰 교환 요청 시 매개변수
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;grant_type=authorization_code (필수)&lt;/li&gt;
&lt;li&gt;code (필수)&lt;/li&gt;
&lt;li&gt;redirect_uri (필수 : 2. 에서 redirect_uri 을 보낸경우경우)&lt;/li&gt;
&lt;li&gt;client_id (필수)&lt;/li&gt;
&lt;li&gt;client_secret (필수)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;흐름&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1161&quot; data-origin-height=&quot;434&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bv12Ij/btsLKr5DWMP/98LoWlt5UnTZVqSls5OWYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bv12Ij/btsLKr5DWMP/98LoWlt5UnTZVqSls5OWYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bv12Ij/btsLKr5DWMP/98LoWlt5UnTZVqSls5OWYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbv12Ij%2FbtsLKr5DWMP%2F98LoWlt5UnTZVqSls5OWYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1161&quot; height=&quot;434&quot; data-origin-width=&quot;1161&quot; data-origin-height=&quot;434&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1195&quot; data-origin-height=&quot;518&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2HH8m/btsLMlXgbxX/SxeeTYSMCiDKulbIH2stHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2HH8m/btsLMlXgbxX/SxeeTYSMCiDKulbIH2stHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2HH8m/btsLMlXgbxX/SxeeTYSMCiDKulbIH2stHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2HH8m%2FbtsLMlXgbxX%2FSxeeTYSMCiDKulbIH2stHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1195&quot; height=&quot;518&quot; data-origin-width=&quot;1195&quot; data-origin-height=&quot;518&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1142&quot; data-origin-height=&quot;621&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BpgCs/btsLLTmy4Wp/1rEMd1mIRH25VLHRdm2AYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BpgCs/btsLLTmy4Wp/1rEMd1mIRH25VLHRdm2AYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BpgCs/btsLLTmy4Wp/1rEMd1mIRH25VLHRdm2AYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBpgCs%2FbtsLLTmy4Wp%2F1rEMd1mIRH25VLHRdm2AYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1142&quot; height=&quot;621&quot; data-origin-width=&quot;1142&quot; data-origin-height=&quot;621&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1259&quot; data-origin-height=&quot;660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WUtet/btsLLPR3aTb/VJDqFerH5dXgVG4URzXyV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WUtet/btsLLPR3aTb/VJDqFerH5dXgVG4URzXyV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WUtet/btsLLPR3aTb/VJDqFerH5dXgVG4URzXyV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWUtet%2FbtsLLPR3aTb%2FVJDqFerH5dXgVG4URzXyV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1259&quot; height=&quot;660&quot; data-origin-width=&quot;1259&quot; data-origin-height=&quot;660&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실습&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본세팅 : &lt;a href=&quot;https://hwanguu.tistory.com/71&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://hwanguu.tistory.com/71&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1736686504814&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Oauth2 Keycloak Docker compose, 기본세팅&quot; data-og-description=&quot;version: '3.9'services: postgres: image: postgres:latest container_name: postgres restart: always environment: POSTGRES_USER: keycloak POSTGRES_PASSWORD: keycloak POSTGRES_DB: keycloak ports: - &amp;quot;5432:5432&amp;quot; keycloak: image: quay.io/keycloak/keycloak:19.0.1 &quot; data-og-host=&quot;hwanguu.tistory.com&quot; data-og-source-url=&quot;https://hwanguu.tistory.com/71&quot; data-og-url=&quot;https://hwanguu.tistory.com/71&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/z7LKM/hyX0kFHr4u/CMLiBUD7HTPWkBWuK2318k/img.png?width=800&amp;amp;height=411&amp;amp;face=0_0_800_411,https://scrap.kakaocdn.net/dn/Ngohx/hyX0vNZRla/tHjjDcIFgSSS1sT3bVZeu0/img.png?width=800&amp;amp;height=411&amp;amp;face=0_0_800_411,https://scrap.kakaocdn.net/dn/beDoVV/hyX0ycRW3X/SbGgfJzMWgvAOULYuFBTik/img.png?width=1348&amp;amp;height=694&amp;amp;face=0_0_1348_694&quot;&gt;&lt;a href=&quot;https://hwanguu.tistory.com/71&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hwanguu.tistory.com/71&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/z7LKM/hyX0kFHr4u/CMLiBUD7HTPWkBWuK2318k/img.png?width=800&amp;amp;height=411&amp;amp;face=0_0_800_411,https://scrap.kakaocdn.net/dn/Ngohx/hyX0vNZRla/tHjjDcIFgSSS1sT3bVZeu0/img.png?width=800&amp;amp;height=411&amp;amp;face=0_0_800_411,https://scrap.kakaocdn.net/dn/beDoVV/hyX0ycRW3X/SbGgfJzMWgvAOULYuFBTik/img.png?width=1348&amp;amp;height=694&amp;amp;face=0_0_1348_694');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Oauth2 Keycloak Docker compose, 기본세팅&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;version: '3.9'services: postgres: image: postgres:latest container_name: postgres restart: always environment: POSTGRES_USER: keycloak POSTGRES_PASSWORD: keycloak POSTGRES_DB: keycloak ports: - &quot;5432:5432&quot; keycloak: image: quay.io/keycloak/keycloak:19.0.1&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hwanguu.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;url : &lt;span style=&quot;background-color: #ffffff; color: #212121; text-align: left;&quot;&gt;localhost:8080/realms/oauth2/protocol/openid-connect/auth?response_type=code&amp;amp;client_id=oauth2-client-app&amp;amp;scope=profile email&amp;amp;redirect_uri=http://localhost:8081&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 인증 서버 로그인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1442&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/besGFL/btsLJz4p4fP/PYTmYnRikvDUqwbKzXXQjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/besGFL/btsLJz4p4fP/PYTmYnRikvDUqwbKzXXQjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/besGFL/btsLJz4p4fP/PYTmYnRikvDUqwbKzXXQjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbesGFL%2FbtsLJz4p4fP%2FPYTmYnRikvDUqwbKzXXQjK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1442&quot; height=&quot;720&quot; data-origin-width=&quot;1442&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 로그인 성공시 return 값 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1473&quot; data-origin-height=&quot;47&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5TcDT/btsLJyxDthx/YWmCfhQ8Qv8SCPXIQccEk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5TcDT/btsLJyxDthx/YWmCfhQ8Qv8SCPXIQccEk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5TcDT/btsLJyxDthx/YWmCfhQ8Qv8SCPXIQccEk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5TcDT%2FbtsLJyxDthx%2FYWmCfhQ8Qv8SCPXIQccEk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1473&quot; height=&quot;47&quot; data-origin-width=&quot;1473&quot; data-origin-height=&quot;47&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://localhost:8081/?session_state=785dbead-0011-4939-9219-806e49651453&amp;amp;code=&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;9d77339d-60f7-4630-828e-65838ca30293.785dbead-0011-4939-9219-806e49651453.a86f1300-5de6-4970-b889-a72430531df5&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1번에서 파라미터로 보냈던 redirect_url 로 code가 담겨져서 온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. code를 이용하여 token 요청&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;b&gt;주의사항&lt;/b&gt; *&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp; 2번에서 받았던 code 2번에서 보냈던 redirect_url은&amp;nbsp; 그대로 넣어서 요청한다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp; code를 발급후 token 발급할 때 expiredTime이 짧기 때문에 바로 요청을 해야한다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp; 그리고 code는 재사용 할 수 없다. 1번만 사용가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;359&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AzhFF/btsLI5CpjL1/s6LKckQ3CacVJwPapkJ33K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AzhFF/btsLI5CpjL1/s6LKckQ3CacVJwPapkJ33K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AzhFF/btsLI5CpjL1/s6LKckQ3CacVJwPapkJ33K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAzhFF%2FbtsLI5CpjL1%2Fs6LKckQ3CacVJwPapkJ33K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;736&quot; height=&quot;359&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;359&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 결과 확인&lt;/p&gt;
&lt;pre id=&quot;code_1736682236331&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
    &quot;access_token&quot;: &quot;eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJqOXYyeTNJN0RzTy02aFhqanFGUi1YSURWd2RvWUwyemRfVjN3c05EREFZIn0.eyJleHAiOjE3MzY2ODI0NzUsImlhdCI6MTczNjY4MjE3NSwiYXV0aF90aW1lIjoxNzM2NjgyMDc3LCJqdGkiOiJkOTI1MDNhZC0xNjMzLTRkMGItOThhZC0wNjhmY2M2ZmRiMGEiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL29hdXRoMiIsImF1ZCI6ImFjY291bnQiLCJzdWIiOiJiN2JmNzk5OC01Yzk4LTQ4NmItOTdiYi1iODMwMzc0MGRkYjciLCJ0eXAiOiJCZWFyZXIiLCJhenAiOiJvYXV0aDItY2xpZW50LWFwcCIsInNlc3Npb25fc3RhdGUiOiI3ODVkYmVhZC0wMDExLTQ5MzktOTIxOS04MDZlNDk2NTE0NTMiLCJhY3IiOiIwIiwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iLCJkZWZhdWx0LXJvbGVzLW9hdXRoMiJdfSwicmVzb3VyY2VfYWNjZXNzIjp7ImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYWNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoiZW1haWwgcHJvZmlsZSIsInNpZCI6Ijc4NWRiZWFkLTAwMTEtNDkzOS05MjE5LTgwNmU0OTY1MTQ1MyIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwibmFtZSI6ImNob2kgc2Vod2FuIiwicHJlZmVycmVkX3VzZXJuYW1lIjoidXNlciIsImdpdmVuX25hbWUiOiJjaG9pIiwiZmFtaWx5X25hbWUiOiJzZWh3YW4iLCJlbWFpbCI6InVzZXJAbmF2ZXIuY29tIn0.LRmQZEM82DIWPRKvdWLZNPyj7Je_AYlEEmkPJF4M9RADzWh7hd8lMoQg-HRl6o1QI6oUPXRFOEpXTgIeqxCKQ1ExVKshbFZ0a3Fqh5kMkbZwsqnFzlJJqJdkV7-_yI2gGBlMgJ4LaMt5mr5umQf20itHdFGpgSRqrJ54pNcVDmQhpfSi_GF7p-_Wq_tZ5z0816DPq-uLc3A6xS0nrqTU6VmoQQd9MXHGgz_-3FzHcNlcr3AIABO5Yrh3jETtHFX1vG5Qai8AokEOQGj3zd8wj9TZhEK95T1uiGVdPXMi2GuHiCGJUHPa9wqQOnfm582QjmPyJcF5neBatZxMx2p65Q&quot;,
    &quot;expires_in&quot;: 300,
    &quot;refresh_expires_in&quot;: 1800,
    &quot;refresh_token&quot;: &quot;eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI4NWNmMTZkNS04OWY1LTQxY2EtOWQ4ZS1hMjZiODFiMGVmNjgifQ.eyJleHAiOjE3MzY2ODM5NzUsImlhdCI6MTczNjY4MjE3NSwianRpIjoiMjJiMjMwODUtNDcxMC00NGQxLTliYmYtNjNmZGIwYWQ2NzEzIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy9vYXV0aDIiLCJhdWQiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL29hdXRoMiIsInN1YiI6ImI3YmY3OTk4LTVjOTgtNDg2Yi05N2JiLWI4MzAzNzQwZGRiNyIsInR5cCI6IlJlZnJlc2giLCJhenAiOiJvYXV0aDItY2xpZW50LWFwcCIsInNlc3Npb25fc3RhdGUiOiI3ODVkYmVhZC0wMDExLTQ5MzktOTIxOS04MDZlNDk2NTE0NTMiLCJzY29wZSI6ImVtYWlsIHByb2ZpbGUiLCJzaWQiOiI3ODVkYmVhZC0wMDExLTQ5MzktOTIxOS04MDZlNDk2NTE0NTMifQ.8hbCJ4SAyiXadsnru8RU6zPzDR8ZYkNEz_PT5rf1Q1w&quot;,
    &quot;token_type&quot;: &quot;Bearer&quot;,
    &quot;not-before-policy&quot;: 0,
    &quot;session_state&quot;: &quot;785dbead-0011-4939-9219-806e49651453&quot;,
    &quot;scope&quot;: &quot;email profile&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와같이 access_token, refresh_token이 응답으로 온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만일 2번에서 token 전송시 expiredTime 이 초과 되었거나, code를 2번사용한경우 아래와 같은 에러가 발생한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;549&quot; data-origin-height=&quot;165&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEKO1X/btsLJ9K4ffv/hrKaRl8a56c8b0VAxKaaN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEKO1X/btsLJ9K4ffv/hrKaRl8a56c8b0VAxKaaN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEKO1X/btsLJ9K4ffv/hrKaRl8a56c8b0VAxKaaN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEKO1X%2FbtsLJ9K4ffv%2FhrKaRl8a56c8b0VAxKaaN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;549&quot; height=&quot;165&quot; data-origin-width=&quot;549&quot; data-origin-height=&quot;165&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;references-및-사진-출처&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;References 및 사진 출처&lt;/h2&gt;
&lt;blockquote style=&quot;color: #000000; text-align: start;&quot; data-ke-style=&quot;style2&quot;&gt;정수원 스프링 시큐리티 OAuth2&lt;/blockquote&gt;</description>
      <category>Spring/Oauth2</category>
      <author>hwanguu</author>
      <guid isPermaLink="true">https://hwanguu.tistory.com/70</guid>
      <comments>https://hwanguu.tistory.com/70#entry70comment</comments>
      <pubDate>Sun, 12 Jan 2025 20:50:35 +0900</pubDate>
    </item>
  </channel>
</rss>