๐ŸŒฑ Infra/KeyCloak

[keycloak ๋ง›๋ณด๊ธฐ #2] OpenID Connection ์‚ฌ์šฉ์ž ์ธ์ฆ ์ดํ•ดํ•˜๊ธฐ

mini_world 2024. 11. 25. 15:16
๋ชฉ์ฐจ ์ ‘๊ธฐ

์ฐธ๊ณ ์ž๋ฃŒ

* ์ฑ…: https://www.yes24.com/Product/Goods/122459785

* ํ…Œ์ŠคํŠธ ์†Œ์Šค์ฝ”๋“œ: https://github.com/PacktPublishing/Keycloak---Identity-and-Access-Management-for-Modern-Applications-2nd-Edition


์‹ค์Šต ์ค€๋น„) Keycloak & ํ…Œ์ŠคํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ธํŒ…

Keycloak์„ ๋กœ์ปฌ์—์„œ ๋จผ์ € ์‹คํ–‰ํ•œ๋‹ค.

docker run -p 8080:8080 \
          -e KEYCLOAK_ADMIN=admin \
          -e KEYCLOAK_ADMIN_PASSWORD=admin \
          quay.io/keycloak/keycloak \
          start-dev

์ดํ›„ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•œ๋‹ค.

git clone https://github.com/PacktPublishing/Keycloak---Identity-and-Access-Management-for-Modern-Applications-2nd-Edition.git
cd Keycloak---Identity-and-Access-Management-for-Modern-Applications-2nd-Edition/ch4
npm install
npm start

 


์‹ค์Šต #1) OIDC Discovery Endpoint ํ™•์ธ

*[์ฐธ๊ณ ]OpenID Connect๋กœ ๋ณด์•ˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ์„œ๋น„์Šค

 

์‹ค์Šตํ•ด๋ณด๊ธฐ

ํ…Œ์ŠคํŠธ ํŽ˜์ด์ง€ (http://localhost:8000)์— ์ ‘์†ํ•œ๋‹ค.

'1 - Discovery' ํด๋ฆญ ๋ฐ ์˜ฌ๋ฐ”๋ฅธ Issuer๋ฅผ ์ž…๋ ฅ ํ›„ Load OpenID Provider Configuration์„ ํด๋ฆญํ•œ๋‹ค.
๊ทธ๋Ÿผ ์•„๋ž˜ ์บก์ณ์‚ฌ์ง„์ฒ˜๋Ÿผ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

์ด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋“ค์€ Well-Known ์„ค์ • ์—”๋“œํฌ์ธํŠธ (๊ฒ€์ƒ‰(discovery)์—”๋“œํฌ์ธํŠธ)์ด๋ฉฐ, 
OpenID Provider(OP)์˜ ์„ค์ • ์ •๋ณด๋ฅผ ์ž๋™์œผ๋กœ ์ฐพ์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ‘œ์ค€ํ™”๋œ ์—”๋“œํฌ์ธํŠธ์ด๋‹ค.

 

์ฃผ์š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์˜๋ฏธ

์•„๋ž˜ ํ‘œ๋Š” ์ฃผ์š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์˜๋ฏธ๋ฅผ ์„ค๋ช…ํ•˜๊ณ ์žˆ๋‹ค.

๊ตฌ๋ถ„ ์„ค๋ช…
issuer OpenID Provider์˜ ์‹๋ณ„์ž URL
authorization_endpoint OpenID Provider์˜ ์‹๋ณ„์ž URL (์ธ์ฆ์š”์ฒญ)
token_endpoint ํ† ํฐ์„ ๋ฐœ๊ธ‰๋ฐ›๋Š” URL (ํ† ํฐ์š”์ฒญ)
introspection_endpoint ์•ก์„ธ์Šค ํ† ํฐ์ด๋‚˜ ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์˜ ์œ ํšจ์„ฑ์„ ํ™•์ธํ•˜๋Š” URL (์ ๊ฒ€์š”์ฒญ)
userinfo_endpoint ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” URL (UserInfo์š”์ฒญ)
end_session_endpoint ๋กœ๊ทธ์•„์›ƒ์„ ์ฒ˜๋ฆฌํ•˜๋Š” URL
jwks_uri ๊ณต๊ฐœ ํ‚ค๋ฅผ ์ œ๊ณตํ•˜๋Š” URL
grant_types_supported ์ง€์›ํ•˜๋Š” ์ธ์ฆ ๋ฐฉ์‹(์˜ˆ: authorization_code, client_credentials ๋“ฑ)
response_types_supported ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ ์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‘๋‹ต ํ˜•์‹(์˜ˆ: code, token, id_token ๋“ฑ)

 

OIDC discovery endpoint ํ‘œ์ค€ spec

OpenID Connect Discovery 1.0 ์ŠคํŽ™์€ OpenID Foundation์—์„œ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๋‹ค.

Discovery endpoint์˜ ํ‘œ์ค€ ๊ฒฝ๋กœ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

http://{keycloak domain}/realms/{realm-name}/.well-known/openid-configuration
#http://localhost:8080/realms/myrealm/.well-known/openid-configuration

 


์‹ค์Šต #2) Authorization Code(์ธ๊ฐ€์ฝ”๋“œ) ๋ฐœ๊ธ‰๊ณผ์ • 

 

Authentication ํ•„๋“œ ํ™•์ธ

๋จผ์ € keycloak์—์„œ๋Š” oidc-playground ๋ผ๋Š” ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. (realm -> clients -> client์ƒ์„ฑ)
๋˜ํ•œ ์‚ฌ์šฉ์ž๋„ ์ƒ์„ฑํ•ด์•ผํ•œ๋‹ค.
ํ…Œ์ŠคํŠธ ์œ ์ €๋Š” ์ž„์˜ ID๋กœ ์ƒ์„ฑํ•œ ํ›„ (์—ฌ๊ธฐ์—์„œ๋Š” user01๋กœ ์ƒ์„ฑํ–ˆ๋‹ค), Credentialsํƒญ์—์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์„ค์ •ํ•œ๋‹ค.



์ดํ›„ ํ…Œ์ŠคํŠธ ํŽ˜์ด์ง€ (http://localhost:8000)์—์„œ 2 - Authentication๋ฅผ ํด๋ฆญํ•œ๋‹ค.

์˜ฌ๋ฐ”๋ฅธ ๊ฐ’์„ ์ž…๋ ฅ(์•„๋ž˜ ์ฐธ๊ณ )ํ•˜๊ณ  Generate Authentication Request๋ฅผ ํด๋ฆญํ•˜์—ฌ ์ธ์ฆ์š”์ฒญ์ด ์–ด๋–ป๊ฒŒ ์ƒ์„ฑ๋˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

์ฒซ๋ฒˆ์งธ ํšŒ์ƒ‰๋ฐ•์Šค Authentication์—์„œ์˜ ๊ฐ ํ•„๋“œ๋Š” ์Šคํฌ๋ฆฐ์ƒท ๋‚ด์šฉ ํ˜น์€ ์•„๋ž˜ ๋‚ด์šฉ์„ ์ฐธ๊ณ ํ•œ๋‹ค.

  • client_id: keycloak์—์„œ ์ƒ์„ฑํ•œ client id
  • scope:
    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์–ด๋–ค ์ •๋ณด๋‚˜ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๊ณ  ์‹ถ์€์ง€ ๋‚˜ํƒ€๋‚ด๋Š” ๊ถŒํ•œ ๋ฒ”์œ„
    • openid๋Š” ๊ธฐ๋ณธ๊ฐ’์ด๋ฉฐ, ๊ทธ ์™ธ์—๋„ profile, email, phone, address ๋“ฑ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • prompt: ์‚ฌ์šฉ์ž ์ธ์ฆ ์‹œ ํŠน์ • ๋™์ž‘์„ ๊ฐ•์ œํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ
    • none: ์ด๋ฏธ ๋กœ๊ทธ์ธ ๋œ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ ์—†์ด ์ง„ํ–‰
    • login: ๊ฐ•์ œ๋กœ ๋‹ค์‹œ ๋กœ๊ทธ์ธํ•˜๋„๋ก ํ•จ
    • consent: ๊ถŒํ•œ ๋“ฑ์˜ ํ™”๋ฉด์„ ๊ฐ•์ œ๋กœ ๋ณด์—ฌ์คŒ
    • select_account: ๊ณ„์ • ์„ ํƒ ํ™”๋ฉด์„ ๋ณด์—ฌ์คŒ
  • max_age: ๋กœ๊ทธ์ธ ์„ธ์…˜์˜ ์ตœ๋Œ€ ํ—ˆ์šฉ ์‹œ๊ฐ„(์ดˆ)
  • login_hint: ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์—์„œ ์‚ฌ์šฉ์ž ID๋ฅผ ๋ฏธ๋ฆฌ ์ฑ„์›Œ๋„ฃ์„ ๋•Œ ์‚ฌ์šฉ
    • ์˜ˆ๋ฅผ๋“ค์–ด user01์„ ์ž…๋ ฅํ•ด๋‘๋ฉด, ์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ์‹œ ๋ฏธ๋ฆฌ user01์ด ์ฑ„์›Œ์ ธ์žˆ๋‹ค.
    • ์‚ฌ์šฉ์ž ํŽธ์˜์„ฑ์„ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

 

Authentication Request ํ™•์ธ

์ด๋ฒˆ ๋‹จ๊ณ„์—์„œ๋Š” ์‹ค์ œ Authentication Request๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€(?) ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Authentication Response ํ™•์ธ

์œ„ ์š”์ฒญ์ด ์ฒ˜๋ฆฌ๋˜๋ฉด Authentication Response๋ฅผ ๋ฐ›๊ฒŒ ๋œ๋‹ค.

์‘๋‹ต์œผ๋กœ ๋ฐ›์€ ์ฝ”๋“œ๋Š” IDํ† ํฐ๊ณผ ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์„ ์–ป๊ธฐ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์ธ๊ฐ€์ฝ”๋“œ(Authorization Code)์ด๋‹ค.

๐Ÿ’ก ์—ฌ๊ธฐ์„œ ๊ถ๊ธˆํ•œ๋ถ€๋ถ„ -์ธ์ฆ์ฝ”๋“œ๋ผ๊ณ  ํ•˜์ง€ ์•Š๊ณ  ์ธ๊ฐ€์ฝ”๋“œ๋ผ๊ณ  ์ผ์„๊นŒ?
 
์ธ์ฆ๊ณผ ์ธ๊ฐ€๋Š” ์‚ฌ์ „์  ์ •์˜๋กœ ๋ณด์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
      - ์ธ์ฆ(Authentication): "์ด ์‚ฌ๋žŒ์ด user01์ด ๋งž๋‹ค"
      - ์ธ๊ฐ€(Authorization): "user01์€ ์ด ํŒŒ์ผ์„ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค"

OIDC๋Š” OAuth 2.0์œ„์— ๊ตฌ์ถ•๋˜์–ด์žˆ์–ด ์‚ฌ์šฉ์ž๋ฅผ ์ธ์ฆํ•˜๋ฉด์„œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ๊ถŒํ•œ๋„ ๋ฐœ๊ธ‰๋ฐ›๊ฒŒ ๋œ๋‹ค.
์‚ฌ์šฉ์ž์ธ์ฆ->๊ถŒํ•œ๋ถ€์—ฌ ๊ณผ์ •์ด ํ•œ๋ฒˆ์— ์—ฐ์†์ ์œผ๋กœ ์ผ์–ด๋‚˜๋ฉฐ, ์ด๋ฒˆ ๋‹จ๊ณ„์—์„œ๋Š” ์ธ์ฆ ํ๋ฆ„ ์ค‘ ์ธ๊ฐ€์ฝ”๋“œ๋ฅผ ๋ฐœ๊ธ‰๋ฐ›๋Š” ๋ถ€๋ถ„์ด๋‹ค.

โ”Œโ”€โ”€โ”€โ”   โ”Œโ”€โ”€โ”€โ”   โ”Œโ”€โ”€โ”€โ”   โ”Œโ”€โ”€โ”€โ”€โ”   โ”Œโ”€โ”€โ”€โ”€โ”
  โ”‚  ์‚ฌ์šฉ์ž  โ”‚ -> โ”‚    ์ธ์ฆ   โ”‚ -> โ”‚   ์ธ๊ฐ€     โ”‚ -> โ”‚   Token    โ”‚ -> โ”‚   Token    โ”‚
  โ”‚  ๋กœ๊ทธ์ธ  โ”‚      โ”‚    ์„ฑ๊ณต   โ”‚      โ”‚   ์ฝ”๋“œ     โ”‚      โ”‚   ์š”์ฒญ        โ”‚      โ”‚    ๋ฐœ๊ธ‰      โ”‚  
โ””โ”€โ”€โ”€โ”˜   โ””โ”€โ”€โ”€โ”˜   โ””โ”€โ”€โ”€โ”˜   โ””โ”€โ”€โ”€โ”€โ”˜   โ””โ”€โ”€โ”ฌโ”€โ”˜
                                             (์ง€๊ธˆ์—ฌ๊ธฐ)                                          ↓
                                                                                        โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                                                                                          โ”‚      ID Token        โ”‚
                                                                                          โ”‚   Access Token  โ”‚
                                                                                          โ”‚   Refresh Token โ”‚
                                                                                        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

์ธ๊ฐ€์ฝ”๋“œ(Authorization code)๋Š” ์ค‘๊ฐ„๊ตํ™˜์ˆ˜๋‹จ์œผ๋กœ, ์‹ค์ œ ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ๊ถŒํ•œ์€ ID Token์ด ๊ฐ€์ง€๊ณ  ์žˆ๊ณ ,
OIDC ์‚ฌ์šฉ์ž ์ธ์ฆ(Authentication) ๊ณผ์ •์€ Authorization Code๋ฅผ ํ†ตํ•ด ID Token์„ ๋ฐœ๊ธ‰๋ฐ›์Œ์œผ๋กœ์จ ์™„์„ฑ๋œ๋‹ค.

 

 


์‹ค์Šต #3) ID Token ๋ฐœ๊ธ‰๊ณผ์ •

์ด์ œ ์‹ค์Šต#2์—์„œ ๋ฐœ๊ธ‰๋ฐ›์€ Authorization Code๋ฅผ ๊ฐ€์ง€๊ณ  ID Token์„ ๋ฐœ๊ธ‰๋ฐ›์•„๋ณด์ž.

์‹ค์Šตํ•ด๋ณด๊ธฐ

ํ…Œ์ŠคํŠธ ํŽ˜์ด์ง€ (http://localhost:8000)์—์„œ 3 - Token๋ฅผ ํด๋ฆญํ•œ๋‹ค.

์‹ค์Šต #2์—์„œ ๋ฐœ๊ธ‰๋ฐ›์€ ์ธ๊ฐ€(Authorization)์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ID Token & Refresh Token, Access Token ๋“ฑ์„ ๋ฐœ๊ธ‰๋ฐ›์•˜๋‹ค.

 

Token Response ํ•„๋“œ ์•Œ์•„๊ฐ€๊ธฐ 

๊ตฌ๋ถ„ ์„ค๋ช…
access_token - ๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ํ† ํฐ
- JWT ํ˜•์‹์œผ๋กœ ์ธ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด
- ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„์— ์ ‘๊ทผํ•  ๋•Œ ์‚ฌ์šฉ
expires_in - ์•ก์„ธ์Šค ํ† ํฐ์˜ ์œ ํšจ ์‹œ๊ฐ„ (์ดˆ)
refresh_expires_in - ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์˜ ์œ ํšจ ์‹œ๊ฐ„ (์ดˆ)
refresh_token - ์•ก์„ธ์Šค ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜์—ˆ์„ ๋•Œ ์ƒˆ๋กœ์šด ํ† ํฐ์„ ๋ฐœ๊ธ‰๋ฐ›๊ธฐ ์œ„ํ•œ ํ† ํฐ 
- ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค์‹œ ๋กœ๊ทธ์ธํ•˜์ง€ ์•Š์•„๋„ ๋จ
token_type - ํ† ํฐ์˜ ํƒ€์ž…์„ ๋‚˜ํƒ€๋ƒ„
- Bearer๋Š” ํ† ํฐ ์†Œ์ง€์ž์—๊ฒŒ ๊ถŒํ•œ์„ ๋ถ€์—ฌ
id_token - ์‚ฌ์šฉ์ž์˜ ์‹ ์› ์ •๋ณด๋ฅผ ํฌํ•จํ•œ JWT
- OIDC์—์„œ ์ถ”๊ฐ€๋œ ํ† ํฐ
- ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ํฌํ•จ
not-before-policy - ํ† ํฐ์ด ์œ ํšจํ•ด์ง€๋Š” ์‹œ์ž‘ ์‹œ๊ฐ„
- 0์€ ์ฆ‰์‹œ ์œ ํšจํ•จ์„ ์˜๋ฏธ
session_state - ํ˜„์žฌ ์„ธ์…˜์˜ ๊ณ ์œ  ์‹๋ณ„์ž
scope - ํ† ํฐ์ด ๊ฐ€์ง„ ๊ถŒํ•œ ๋ฒ”์œ„
- "openid profile email": ๊ธฐ๋ณธ ์ธ์ฆ, ํ”„๋กœํ•„ ์ •๋ณด, ์ด๋ฉ”์ผ ์ •๋ณด ์ ‘๊ทผ ๊ฐ€๋Šฅ

 

id_token, access_token, refresh_token ์ดํ•ดํ•˜๊ธฐ

์ œ์ผ ์ค‘์š”ํ•œ๊ฑด ์•„๋ž˜ ์„ธ ๊ฐ€์ง€ ํ† ํฐ์ด๋‹ค. 
์ด ์„ธ ํ† ํฐ ๋ชจ๋‘ JWTํ˜•์‹์ด๋‹ค.

[ํด๋ผ์ด์–ธํŠธ]          [์ธ์ฆ ์„œ๋ฒ„]           [๋ฆฌ์†Œ์Šค ์„œ๋ฒ„]
    โ”‚                  โ”‚                    โ”‚
    โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”‚                    โ”‚
    โ”œโ”€>โ”‚Access    โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€>โ”‚ API ์ ‘๊ทผ
    โ”‚  โ”‚Token     โ”‚    โ”‚                    โ”‚
    โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ”‚                    โ”‚
    โ”‚                  โ”‚                    โ”‚
    โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”‚                    โ”‚
    โ”œโ”€>โ”‚Refresh   โ”‚โ”€โ”€โ”€>โ”‚ ์ƒˆ ํ† ํฐ ๋ฐœ๊ธ‰          โ”‚
    โ”‚  โ”‚Token     โ”‚    โ”‚                    โ”‚
    โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ”‚                    โ”‚
    โ”‚                  โ”‚                    โ”‚
    โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”‚                    โ”‚
    โ””โ”€>โ”‚ID Token  โ”‚โ”€โ”€โ”€>โ”‚ ์‚ฌ์šฉ์ž ์ธ์ฆ           โ”‚
       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ”‚                    โ”‚
  • access_token: API ์ ‘๊ทผ์šฉ ํ† ํฐ (API ํ˜ธ์ถœ ์‹œ ๊ถŒํ•œ ์ฆ๋ช…)
    - ๊ถŒํ•œ๋ฒ”์œ„(Scope) / ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ ๊ถŒํ•œ / ๋งŒ๋ฃŒ์‹œ๊ฐ„ / Client ID
  • refresh_token: ๋งŒ๋ฃŒ๋œ Access Token ๊ฐฑ์‹ ์šฉ ํ† ํฐ
    - ํ† ํฐ ๊ฐฑ์‹ ์šฉ์œผ๋กœ ์ตœ์†Œํ•œ์˜ ์ •๋ณด๋งŒ ๋‹ด์Œ(๋ณด์•ˆ์ •๋ณด)
  • id_token: ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด์šฉ ํ† ํฐ (์‚ฌ์šฉ์ž ์‹ ์› ์ •๋ณด ํ™•์ธ)
    - ์‚ฌ์šฉ์ž์ •๋ณด / ์ธ์ฆ์‹œ์  / ์ธ์ฆ๋ฐฉ๋ฒ• / ํ† ํฐ๋ฐœ๊ธ‰์ž

Access Token์ด ๋งŒ๋ฃŒ๋˜๋ฉด ๊ฐ€์ง€๊ณ ์žˆ๋˜ Refresh Token์œผ๋กœ ์ธ์ฆ์„œ๋ฒ„์— ์š”์ฒญํ•˜๊ฒŒ ๋˜๋ฉฐ,
์ด๋•Œ Access Token ๋ฟ๋งŒ์•„๋‹ˆ๋ผ ๋ชจ๋“  Token์ด ๊ฐฑ์‹ ๋œ๋‹ค. 

[ํด๋ผ์ด์–ธํŠธ]           [์ธ์ฆ ์„œ๋ฒ„]          
    โ”‚                   โ”‚                 
    โ”‚   Refresh Token   โ”‚                 
    โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€> โ”‚                 
    โ”‚                   โ”‚    
    โ”‚                   โ”‚  
    โ”‚   ์ƒˆ๋กœ์šด ํ† ํฐ ์„ธํŠธ    โ”‚                 
    โ”‚ <โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚                 
    โ”‚   - Access Token  โ”‚                 
    โ”‚   - ID Token      โ”‚                 
    โ”‚   - Refresh Token โ”‚

 

 


์‹ค์Šต #4) Token Refresh

์ด์ œ ์‹ค์Šต#3์—์„œ ๋ฐœ๊ธ‰๋ฐ›์€ refresh token ๋ฅผ ๊ฐ€์ง€๊ณ  ํ† ํฐ์„ ๋ชจ๋‘ ์žฌ๋ฐœ๊ธ‰ ํ•ด๋ณด์ž!

์‹ค์Šตํ•ด๋ณด๊ธฐ

ํ…Œ์ŠคํŠธ ํŽ˜์ด์ง€ (http://localhost:8000)์—์„œ 4 - Refresh๋ฅผ ํด๋ฆญํ•œ๋‹ค.

Refresh Request ํ•„๋“œ์—๋Š” RefreshToken์ด ํฌํ•จ๋˜๋ฉฐ, 
๋ชจ๋“  Token์€ ์žฌ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ณ , Refresh์š”์ฒญ์ด ์˜ค๋ฉด ๋ชจ๋‘ ์žฌ๋ฐœ๊ธ‰ ๋œ๋‹ค.

 

 


์‹ค์Šต #5) UserInfo ์š”์ฒญํ•˜๊ธฐ

Access Token์œผ๋กœ UserInfo๋ฅผ ์š”์ฒญํ•ด๋ณด์ž.

์‹ค์Šตํ•ด๋ณด๊ธฐ

ํ…Œ์ŠคํŠธ ํŽ˜์ด์ง€ (http://localhost:8000)์—์„œ 5 - UserInfo๋ฅผ ํด๋ฆญํ•œ๋‹ค.

 

UserInfo Endpoint ์„ค๋ช…

UserInfo Endpoint๋Š” OIDC์˜ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ ์ฃผ์š” ํŠน์ง•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • ID Token์— ์žˆ๋Š” ์ •๋ณด๋ฅผ ๋ณด์™„
  • ํ•ญ์ƒ ์ตœ์‹  ์‚ฌ์šฉ์ž ์ •๋ณด ์ œ๊ณต
  • scope ์„ค์ •์— ๋”ฐ๋ผ ๋ฐ˜ํ™˜๋˜๋Š” ์ •๋ณด๊ฐ€ ๋‹ฌ๋ผ์ง
  • Access Token์˜ ๊ถŒํ•œ ๋ฒ”์œ„ ํ™•์ธ

UserInfo๋Š” AccessToken์„ ์‚ฌ์šฉํ•ด์„œ ์š”์ฒญํ•˜๋ฉฐ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

#1. UserInfo Request
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  ํด๋ผ์ด์–ธํŠธ     โ”‚                โ”‚ UserInfo     โ”‚
โ”‚              โ”‚โ”€โ”€โ”€ GET โ”€โ”€โ”€โ”€โ”€โ”€โ”€>โ”‚ Endpoint     โ”‚
โ”‚              โ”‚                โ”‚              โ”‚
โ”‚              โ”‚ Authorization: โ”‚              โ”‚
โ”‚              โ”‚ Bearer [Access โ”‚              โ”‚
โ”‚              โ”‚   Token]       โ”‚              โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜


#2. UserInfo Response
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  ํด๋ผ์ด์–ธํŠธ     โ”‚                โ”‚ UserInfo     โ”‚
โ”‚              โ”‚<โ”€โ”€ JSON โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚ Endpoint     โ”‚
โ”‚              โ”‚                โ”‚              โ”‚
โ”‚ {                             โ”‚              โ”‚
โ”‚   "sub": "...",               โ”‚              โ”‚
โ”‚   "name": "user234 test",     โ”‚              โ”‚
โ”‚   "email": "user01@..."       โ”‚              โ”‚
โ”‚ }                             โ”‚              โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

 

 

 

728x90