Skip to content
SeungpilPark edited this page Apr 11, 2016 · 1 revision

OAuth 2.0 Jwt ์ธ์ฆ ๊ธฐ๋ฐ˜์˜ IAM ์„œ๋ฒ„ ๊ตฌํ˜„ ๊ฐ€์ด๋“œ - PART 1

์š”๊ตฌ์‚ฌํ•ญ ์ •๋ฆฌ

๊ธˆ๋ฒˆ FORCS ๊ณผ์ œ์—์„œ ํ†ตํ•ฉ์ธ์ฆ์„ผํ„ฐ(IAM)๊ฐ€ ์ฒ˜๋ฆฌํ•ด์•ผํ•  ์‚ฌํ•ญ์€, ํฌ๊ฒŒ ๋‘๊ฐ€์ง€๋กœ ๋งฅ๋ฝ์„ ์žก์„ ์ˆ˜ ์žˆ๋‹ค.

  1. ํ†ตํ•ฉ์ธ์ฆ๊ธฐ๋Šฅ
  2. ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ ์ œ์–ด

ํ†ตํ•ฉ์ธ์ฆ๊ธฐ๋Šฅ

๊ฐ๊ฐ์˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ Single-sign-on ์ด ๋˜์–ด์•ผ ํ•˜๋ฉฐ, ๊ฐ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํ†ตํ•ฉ์ธ์ฆ์„ผํ„ฐ๋ฅผ ํ†ตํ•ด ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ์— ๋Œ€ํ•œ ์งˆ์˜๋ฅผ ์š”๊ตฌํ•˜๊ฒŒ ๋œ๋‹ค.

์ •๋ฆฌ๋ฅผ ํ•ด ๋ณธ ๊ฒฐ๊ณผ ์ •ํ™•ํ•˜๊ฒŒ๋Š” Single-sign-on ์ค‘์—์„œ ํ†ตํ•ฉ์ธ์ฆ ๊ธฐ๋Šฅ์„ ๊ตฌ์ถ•ํ•ด์•ผ ํ•จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ A ์˜ ๋กœ๊ทธ์•„์›ƒ,๋กœ๊ทธ์ธ ์ƒํƒœ์— ๋”ฐ๋ผ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ B,C ๊ฐ€ IAM ์œผ๋กœ๋ถ€ํ„ฐ ๋ณ„๋„์˜ POST ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ๋ฐ›์•„ ๋กœ๊ทธ์ธ,์•„์›ƒ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ํ•„์š”๋Š” ์—†์œผ๋ฉฐ, ๊ฐ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ž์›์˜ ์ด์šฉ์‹œ๋งˆ๋‹ค(DB, ๋ฆฌ์†Œ์Šค) ํ†ตํ•ฉ์ธ์ฆ์„ผํ„ฐ๋กœ๋ถ€ํ„ฐ ํ† ํฐ์ด ์œ ํšจํ•œ์ง€ ์งˆ์˜์— ๋Œ€ํ•ด ์‘๋‹ต๋งŒ ํ•ด ์ค„ ์ˆ˜ ์žˆ์œผ๋ฉด ๋œ๋‹ค.

๋”ฐ๋ผ์„œ, ์ „์ฒด์ ์ธ ์•„ํ‚คํ…์ณ๋Š” OpenSSO ๊ฐ€ ์ œ๊ณตํ•˜๋Š” Application Integrating ์‹œ๋‚˜๋ฆฌ์˜ค ์ค‘์—์„œ User Authentication in Applications With Identity Services ๋ฅผ ๋”ฐ๋ฅธ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

OpenSSO Application Integrating ์‹œ๋‚˜๋ฆฌ์˜ค

User Authentication in Applications With Identity Services

๋ฆฌ์†Œ์Šค ์ ‘๊ทผ ์ œ์–ด

๋ฆฌ์†Œ์Šค ์ ‘๊ทผ ์ œ์–ด์— ๋Œ€ํ•ด์„œ๋Š”, FORCS ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ Nosql ์ธ ํด๋ผ์šฐ๋˜ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๋ฆฌ์†Œ์Šค ์Šคํ† ๋ฆฌ์ง€๋กœ๋Š” Bluemix Object Storage(Openstack swift์™€ ๋™์ผํ•˜๋‹ค) ๋ฅผ ์‚ฌ์šฉํ•  ์˜ˆ์ •์ด๋‹ค. ์ด ๋‘๊ฐ€์ง€๋Š” ๋ชจ๋‘ URL REST API ํ˜ธ์ถœ ๋ฐฉ์‹์™€ CRUD (GET,POST,PUT,DELETE) ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

์ด๋Š” OpenSSO ์˜ Policy Agent ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ๋Šฅ ์ค‘์—์„œ URL Policy Agent ์˜ ๊ฐœ๋…์„ ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ์œผ๋ฉฐ, URL Policy ์˜ ์œ ์ € ๋งคํ•‘ ๋ฐฉ์‹๋„ OpenSSO ์˜ ldap ์œ ์ € ๋งคํ•‘ ๋ฐฉ์‹์„ ๋ฒ—์–ด๋‚˜ , ๊ฐ„๋‹จํ•œ RDBA ์Šคํ‚ค๋งˆ๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ URL Policy ์™€ ํ†ตํ•ฉ์ธ์ฆ ์œ ์ €๋ฅผ ๋งคํ•‘ํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

์ด ๊ณผ์ •์—์„œ ํ†ตํ•ฉ์ธ์ฆ ์œ ์ € ์ •๋ณด์™€ ์œ ์ € ๋งคํ•‘ ๋ฐ์ดํ„ฐ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ตฌ์ถ•ํ•  IAM ์„ผํ„ฐ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค. (FORCS ์ธก์—์„œ๋„ ์ด๋ ‡๊ฒŒ ์›ํ•˜๋”๋ผ.)

๋˜ํ•œ, ๊ฐ ํ†ตํ•ฉ์ธ์ฆ ์œ ์ €๋Š” ํ…Œ๋„ŒํŠธ์™€ ์œ ์ €์•„์ด๋””๋กœ ๊ตฌ๋ถ„์ด ๋˜์–ด์•ผ ํ•˜๋ฉฐ, URl Policy ์— ์˜ํ•ด ์ ‘๊ทผ์ œ์–ด๋ฅผ ๋ฐ›๋Š” ๋Œ€์ƒ์ž๋Š” ํ†ตํ•ฉ์ธ์ฆ ์œ ์ €์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ E-form service provider ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” 3Th party ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋Œ€์ƒ์ž๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ๋‹ค.

๋จผ์ € OpenSSO ์˜ ์ธ์ฆ์œ ์ €์™€ URL Policy ๋งคํ•‘ ๋ฐฉ์‹์„ ์‚ดํŽด๋ณด์ž.

๋‹ค์Œ์€ FORCS ์š”๊ตฌ์กฐ๊ฑด์„ ์ˆ˜๋ ดํ•œ URL Policy ๋งคํ•‘ ๋ฐฉ์‹์ด๋‹ค.

OpenSSO ์˜ ์œ ์ € identity ๊ตฌ๋ถ„์ž๋Š” ํ•˜๋‚˜์˜ ํ† ํฐ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์ง€๋งŒ, ์œ„์˜ ๊ทธ๋ฆผ์—์„œ๋Š” ์œ ์ € identity ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ† ํฐ์— tenant, userkey, clientkey ๋“ฑ์˜ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด์•ผ ํ•œ๋‹ค. OpenSSO ๋ฐฉ์‹์„ ์ทจํ•œ๋‹ค๋ฉด ์œ ์ €์˜ ํ† ํฐ์—์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๊ทธ ์œ ์ €์˜ tenant, clientkey ๋“ฑ์„ ์—ญ์ถ”์ ํ•ด์•ผ ํ•˜์ง€๋งŒ JWT ํ† ํฐ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์‹ ๋ขฐ์„ฑ์žˆ๋Š” (JWT Signature validate) ํ† ํฐ์ด ์ธ์ฆ์„ผํ„ฐ๋กœ ๋„์ฐฉํ•œ๋‹ค๋ฉด ํ† ํฐ ์ž์ฒด์— ๋“ค์–ด์žˆ๋Š” ์ •๋ณด๋ฅผ ๊ทธ๋Œ€๋กœ ์‹ ๋ขฐ์„ฑ ์žˆ๋Š” ์ž๋ฃŒ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆผ์—์„œ ํ‘œํ˜„๋œ Policy1, 2... ๋กœ ํ‘œํ˜„ ํ•œ ๊ฒƒ์€ Google Api (OAuth 2.0) ์—์„œ๋Š” Scope ๋ผ๊ณ  ํ•œ๋‹ค.

์˜ˆ) Google ์˜ Api scope

API Scope ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์„œ๋น„์Šค์‚ฌ๋งˆ๋‹ค ๋‚ด๋ถ€์ ์œผ๋กœ ์Šค์ฝ”ํ”„๋ฅผ ์ปจํŠธ๋กคํ•˜๋Š” ๊ฒƒ์€ ์ œ๊ฐ๊ฐ ๋‹ค๋ฅด์ง€๋งŒ, ์ธ์ฆ์„œ๋ฒ„๊ฐ€ ์Šค์ฝ”ํ”„๋ฅผ ์ „๋‹ฌ๋ฐ›๋Š” ๋ฐฉ์‹์€ ํฌ๊ฒŒ ๋‘๊ฐ€์ง€๋กœ ๋‚˜๋‰œ๋‹ค.

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ Jwt ํ† ํฐ์— ์ง์ ‘ ์Šค์ฝ”ํ”„๋ฅผ ๋„ฃ์–ด์„œ ์ธ์ฆ์„œ๋ฒ„๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹

์ธ์ฆ ํ† ํฐ์— ์Šค์ฝ”ํ”„๋ฅผ ๋„ฃ์–ด์„œ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์ „์— IAM ์— ์‚ฌ์ „์— Policy ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๊ณ , ์ด Policy ๋“ค์ด ์•ฝ์–ด๋กœ ํ•จ์ถ•๊ฐ€๋Šฅํ• ๋•Œ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋˜ํ•œ User Role ๋“ฑ์„ ๊ธฐ์ˆ ํ• ๋•Œ๋„ ์“ฐ์ธ๋‹ค.

์˜ˆ)
Token
{
   .
   .
   scopes: ['address','friends']
}

๋˜๋Š”

Token
{
   .
   .
   roles: ['system_admin','pm']
}
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ธ์ฆ์„œ๋ฒ„๋กœ ์ธ์ฆ์„ ์š”์ฒญํ•  ๋•Œ ์Šค์ฝ”ํ”„๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹

ํ•ด๋‹น ๋ฐฉ์‹์€ Facebook ์ด๋‚˜ Twitter ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‚ฌ์šฉํ•  ๋•Œ ํ”ํžˆ ์ ‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ FORCS ๊ฐ€ ์™ธ๋ถ€ ์„œ๋น„์Šค์— API ๋ฅผ ๊ฐœ๋ฐฉํ•˜๊ณ ์ž ํ•  ๋•Œ์—๋„ ์ด ํ˜•์‹์„ ์ทจํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค.

์œ„ ๊ทธ๋ฆผ์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์Šค์ฝ”ํ”„๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•˜๊ธฐ์— ์•ž์„œ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ํ•ด๋‹น ์Šค์ฝ”ํ”„์— ์‚ฌ์šฉ์ž๋ฅผ ๋Œ€์‹ ํ•˜์—ฌ ์ ‘๊ทผํ•ด๋„ ๋˜๋Š”์ง€๋ฅผ ๋ฌผ์–ด๋ณด๊ณ  ์žˆ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ์ˆ˜๋ฝ์„ ํ•  ๊ฒฝ์šฐ ํด๋ผ์ด์–ธํŠธ๋Š” ์ธ์ฆ์„œ๋ฒ„๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ์š”์ฒญ์„ ํ•œ๋‹ค.

Client

app.request(function(){
   .
   .
   clientKey: ํ•ด๋‹น ์ž์›์„ ๋Œ€๋ฆฌ ์š”์ฒญํ•˜๋Š” 3th party ํด๋ผ์ด์–ธํŠธ
   token: ์ธ์ฆํ† ํฐ
   scopes: ['basic-info','postwall','refreshtoken']
})
  1. ํ•ด๋‹น ์ž์›์„ ๋Œ€๋ฆฌ ์š”์ฒญํ•˜๋Š” 3th party ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์ธ์ฆํ† ํฐ๊ณผ ์Šค์ฝ”ํ”„๋ฅผ ๋“ค๊ณ  ์ธ์ฆ์„œ๋ฒ„์— ์š”์ฒญ์„ ํ•œ๋‹ค.

  2. ์ธ์ฆ์„œ๋ฒ„๋Š” ๋‘๊ฐ€์ง€ ๊ถŒํ•œ์„ ์ฒดํฌํ•œ๋‹ค.

  • 3th party ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•ด๋‹น ์Šค์ฝ”ํ”„์— ์ ‘๊ทผํ•  ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€? (์Šค์ฝ”ํ”„๊ฐ€ ๋ณ„๋„์˜ ๋นŒ๋ง์„ ํ•„์š”๋กœ ํ•˜๊ฑฐ๋‚˜ ํ•˜๋Š” ๊ฒฝ์šฐ)

  • token ์˜ ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๋‹น ์Šค์ฝ”ํ”„์— ์ ‘๊ทผํ•  ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€?

  1. ์ธ์ฆ์„œ๋ฒ„๋Š” ํ•ด๋‹นํ•˜๋Š” 3th party ๋ฅผ ํ†ตํ•œ ์ œ์–ด์š”์ฒญ์— ํ•œํ•˜์—ฌ, ํ•ด๋‹น ์‚ฌ์šฉ์ž์˜ ์ž์› ์ ‘๊ทผ ๊ถŒํ•œ์„ ์ €์žฅํ•œ๋‹ค.

  2. ์ถ”ํ›„ 3th party ๋ฅผ ํ†ตํ•œ ์š”์ฒญ์ด ์˜ฌ ์‹œ์—, 3th party ์ธก์—์„œ ์ „๋‹ฌํ•˜๋Š” ํ† ํฐ์€ ๋‹จ์ˆœํ•œ ClientKey ์ผ์ˆ˜๋„ ์žˆ๊ณ , Jwt ํ† ํฐ์ผ์ˆ˜๋„ ์žˆ๋‹ค. ์–ด๋–ค ๊ฒฝ์šฐ์ด๋˜ ์ธ์ฆ์„œ๋ฒ„๋Š” ํ† ํฐ์œผ๋กœ๋ถ€ํ„ฐ ์–ด๋– ํ•œ 3th party ์ธ๊ฐ€๋ฅผ ์•Œ์•„๋‚ด์–ด ์•Œ๋งž์€ ์ž์› ์ ‘๊ทผ์„ ์ˆ˜๋ฝํ•˜์—ฌ์•ผ ํ•œ๋‹ค.

  3. 3th party ๋Š” ๊ฐ๊ฐ์˜ ๊ธฐ๋ณธ scopes ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๋งŒ์ผ ์‚ฌ์šฉ์ž ํ† ํฐ์ด ์—†์ด clientKey ๋งŒ์ด ์ธ์ฆ์„œ๋ฒ„์— ๋„์ฐฉํ•œ๋‹ค๋ฉด, ๊ธฐ๋ณธ scopes ์ •์ฑ…๋งŒ์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•œ๋‹ค.

์˜ˆ) Attlacian ์ œํ’ˆ๊ตฐ์ด 3th party ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜(attlacian connect add-on ์ด๋ผ ํ•œ๋‹ค.) ์—๊ฒŒ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ—ˆ์šฉํ•˜๋Š” ์ ‘๊ทผ ์ž์›๋“ค

Path GET POST PUT DELETE
/rest/api/{version}/attachment22.0.alpha1latest READ N/A N/A DELETE
/rest/api/{version}/auditing2latest READ WRITE WRITE N/A
/rest/api/{version}/comment/.+/properties22.0.alpha1latest READ WRITE WRITE DELETE
/rest/api/{version}/component22.0.alpha1latest READ PROJECT_ADMIN PROJECT_ADMIN PROJECT_ADMIN
/rest/api/{version}/configuration2latest READ N/A N/A N/A
/rest/api/{version}/customFieldOption22.0.alpha1latest READ N/A N/A N/A
/rest/api/{version}/dashboard/.+/items/.+/properties22.0.alpha1latest READ WRITE WRITE DELETE
/rest/api/{version}/field22.0.alpha1latest READ ADMIN N/A N/A
/rest/api/{version}/filter22.0.alpha1latest READ WRITE WRITE DELETE
/rest/api/{version}/group22.0.alpha1latest ADMIN N/A N/A N/A
/rest/api/{version}/groups/picker22.0.alpha1latest READ N/A N/A N/A
/rest/api/{version}/issue22.0.alpha1latest READ WRITE WRITE DELETE
/rest/api/{version}/issueLink22.0.alpha1latest READ WRITE N/A DELETE
/rest/api/{version}/issueLinkType22.0.alpha1latest READ ADMIN ADMIN ADMIN
/rest/api/{version}/issuetype22.0.alpha1latest READ ADMIN ADMIN ADMIN
/rest/api/{version}/jql/autocompletedata2latest READ N/A N/A N/A
/rest/api/{version}/mypermissions22.0.alpha1latest READ N/A N/A N/A
/rest/api/{version}/myself2latest READ N/A N/A N/A
/rest/api/{version}/priority22.0.alpha1latest READ N/A N/A N/A
/rest/api/{version}/project22.0.alpha1latest READ PROJECT_ADMIN PROJECT_ADMIN PROJECT_ADMIN
/rest/api/{version}/project/.+/properties/.+22.0.alpha1latest N/A N/A WRITE N/A
/rest/api/{version}/resolution22.0.alpha1latest READ N/A N/A N/A
/rest/api/{version}/role2latest ADMIN N/A N/A N/A
/rest/api/{version}/screens22.0.alpha1latest ADMIN ADMIN N/A N/A
/rest/api/{version}/search22.0.alpha1latest READ READ N/A N/A
/rest/api/{version}/serverInfo22.0.alpha1latest READ N/A N/A N/A
/rest/api/{version}/status22.0.alpha1latest READ N/A N/A N/A
/rest/api/{version}/statuscategory22.0.alpha1latest READ N/A N/A N/A
/rest/api/{version}/user22.0.alpha1latest READ N/A N/A N/A
/rest/api/{version}/user/picker22.0.alpha1latest READ N/A N/A N/A
/rest/api/{version}/user/properties22.0.alpha1latest N/A N/A WRITE DELETE
/rest/api/{version}/version22.0.alpha1latest READ PROJECT_ADMIN PROJECT_ADMIN PROJECT_ADMIN
/rest/api/{version}/workflow2latest ADMIN N/A N/A N/A
/rest/api/{version}/worklog2latest READ N/A N/A N/A
/rest/api/{version}/worklog/list2latest N/A READ N/A N/A
/rest/applinks/{version}/entities1.02.0latest PRIVATE READ N/A N/A N/A
/rest/applinks/{version}/entitylink1.02.0latest PRIVATE ADMIN ADMIN ADMIN ADMIN
/rest/applinks/{version}/entitylink/primary1.02.0latest PRIVATE ADMIN ADMIN ADMIN ADMIN
/rest/applinks/{version}/manifest1.02.0latest PRIVATE ADMIN ADMIN ADMIN ADMIN
/rest/applinks/{version}/type/entity1.02.0latest PRIVATE ADMIN ADMIN ADMIN ADMIN
/rest/atlassian-connect/{version}/addons1latest READ N/A N/A N/A
/rest/atlassian-connect/{version}/license1latest READ N/A N/A N/A
/secure/attachment READ N/A N/A N/A
/secure/projectavatar PRIVATE READ N/A N/A N/A
/secure/thumbnail PRIVATE READ N/A N/A N/A
/secure/useravatar PRIVATE READ N/A N/A N/A
/secure/viewavatar PRIVATE READ N/A N/A N/A

์œ„์˜ ๋‘๊ฐ€์ง€ ๊ฒฝ์šฐ ๋ชจ๋‘, URL Policy ๋“ค์˜ ๋ฌถ์Œ์„ ํ•˜๋‚˜์˜ scope ์•ฝ์–ด๋กœ ์ •์˜ํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค.

FORCS ๋„ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์ถ”ํ›„ ์ด๋Ÿฌํ•œ ์„œ๋น„์Šค๋ฅผ ๊ณ„ํšํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์ด ๊ณผ์ •์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

์š”๊ตฌ์‚ฌํ•ญ ๊ฒฐ๋ก 

OpenSSO ๋ฅผ ๋ฐฐ์ œํ•˜๊ณ  ์ œ์–ด๊ฐ€๋Šฅํ•˜๊ณ  ๋ผ์ดํŠธํ•œ ์š”๊ตฌ์กฐ๊ฑด์„ ์ˆ˜ํ–‰ํ•  IAM ์„ผํ„ฐ์™€ IAM ๊ณผ ํ†ต์‹ ํ•  ์ธ์ฆ๋ชจ๋“ˆ์„ ์ œ์ž‘ํ•˜๋Š” ๋ฐ ์žˆ์–ด์„œ ๋‹ค๋ฅธ ๊ธฐ์ˆ ์„ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

  • ํ†ตํ•ฉ์ธ์ฆ ์„œ๋ฒ„

๊ธฐ๋ณธ์ ์ธ ํ†ตํ•ฉ์ธ์ฆ ์„œ๋ฒ„์˜ ๋กœ์ง์€ OAuth 2.0 ๋ฐฉ์‹์„ ์ถ”์ฒœํ•  ์ˆ˜ ์žˆ๋‹ค. ์ถ”๊ฐ€์ ์œผ๋กœ, ์‚ฌ์šฉ์ž ๋ฐ 3th party Application ์˜ CRUD REST API ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค.

์ด ์™ธ์— ์žฆ์€ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์„ฑ๋Šฅ๊ฒ€์ฆ๊ณผ Fail-over ์ˆ˜ํ–‰์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค.

  • ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ ์ œ์–ด

๋ฆฌ์†Œ์Šค ์ ‘๊ทผ ์ œ์–ด์—๋Š” URL Policy ๋ฅผ CRUD ํ•  ์ˆ˜ ์žˆ๋Š” REST API ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค. ๋˜ํ•œ ํ†ตํ•ฉ์ธ์ฆ ์œ ์ € ๋ฐ 3th party Application ๋“ค๊ณผ Policy ๊ฐ„์˜ ๋งคํ•‘ REST ๋˜ํ•œ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค.

  • DB, Switf Wrapper

์œ„์˜ ๋‘๊ฐ€์ง€๋ฅผ ๊ตฌ์ถ•ํ•˜๋ฉด ๊ฐ„๋‹จํ•œ wrapper ๊ตฌํ˜„์œผ๋กœ ์ž๋™์ ์œผ๋กœ ํ•ด๊ฒฐ๋  ์ˆ˜ ์žˆ๋‹ค.

์„ค๊ณ„

ํ†ตํ•ฉ ์ธ์ฆ ์„œ๋ฒ„ (IAM) ์˜ ๋™์ž‘ ๊ตฌ์กฐ๋Š” OAuth 2.0 ์„ ๋”ฐ๋ฅด๋„๋ก ํ•œ๋‹ค. OAuth 2.0 ์„ ๊ธฐ์ˆ ํ•˜๊ธฐ ์•ž์„œ OAuth 1.0 ์„ ์‚ดํŽด๋ณด๋„๋ก ํ•œ๋‹ค.

OAuth 1.0a

OAuth 1.0a ์žฅ์ 

OAuth 1.0a๊ฐ€ ๊ธฐ์กด์˜ ๋‹ค๋ฅธ ์ธ์ฆ๊ณผ ๊ตฌ๋ถ„๋˜๋Š” ํŠน์ง•์€ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€์ด๋‹ค. ์ฒซ์งธ, API๋ฅผ ์ธ์ฆํ•จ์— ์žˆ์–ด ์จ๋“œํŒŒํ‹ฐ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—๊ฒŒ ์‚ฌ์šฉ์ž์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋…ธ์ถœํ•˜์ง€ ์•Š๊ณ  ์ธ์ฆ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ . ๋‘˜์งธ, ์ธ์ฆ(authentication)๊ณผ API๊ถŒํ•œ ๋ถ€์—ฌ(authorization )๋ฅผ ๋™์‹œ์— ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค. OAuth 1.0์ด ๋งŒ๋“ค์–ด์ง€๋Š” ์‹œ์ ์—๋Š” ์จ๋“œํŒŒํ‹ฐ์—๊ฒŒ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋…ธ์ถœํ•˜์ง€ ์•Š๊ณ  ์ธ์ฆํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ์„œ ์ด๋ฏธ Open ID๊ฐ€ ์žˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ Open ID๋Š” API์˜ ๊ถŒํ•œ ๋ถ€์—ฌ๊ธฐ๋Šฅ์„ ๊ธฐ์ง€๊ณ  ์žˆ์ง€ ์•Š์•˜๊ณ  ์ธ์ฆ ๋ฐฉ๋ฒ•๋„ OAuth์™€๋Š” ๋ฐฉํ–ฅ์ด ๋งŽ์ด ๋‹ฌ๋ž๋‹ค.

OAuth 1.0a ๋™์ž‘๋ฐฉ์‹

OAuth 1.0a ๊ฐ€ ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์œ ์ €(user), ์ปจ์Šˆ๋จธ(consumer), ์„œ๋น„์Šค ํ”„๋กœ๋ฐ”์ด๋”(service provider)๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค. OAuth 1.0a ์ธ์ฆ์„ 3-legged OAuth ๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•˜๋Š”๋ฐ OAuth๋Š” ๋‘˜์ด์„œ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์…‹์ด์„œ ํ•˜๋Š” ๊ฒƒ์ด๋ผ๋Š” ๋ง์ด๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ๋Š” ๊ฐ๊ฐ ์œ ์ €๋Š” ํŠธ์œ„ํ„ฐ ์‚ฌ์šฉ์ž, ์ปจ์Šˆ๋จธ๋Š” ํŠธ์œ„ํ„ฐ ๋‹จ๋ง ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜, ์„œ๋น„์Šค ํ”„๋กœ๋ฐ”์ด๋”๋Š” ํŠธ์œ„ํ„ฐ API ์„œ๋น„์Šค ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์‰ฝ๋‹ค.

์ƒˆ๋กœ์šด ํŠธ์œ„ํ„ฐ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์•ฑ์Šคํ† ์–ด์—์„œ ๋‹ค์šด ๋ฐ›์•˜์ง€๋งŒ, ์•„์ง์€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์ด๋ผ๊ณ  ํ•˜์ž. ์‚ฌ์šฉ์ž๋Š” ์ด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•˜๋ฉด ์ด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋˜ ๋‹ค๋ฅธ ์–ด๋–ค ์ง“(๋ชฐ๋ž˜ ์•„์ด๋””/๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๋“ฑ)์„ ํ•  ์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์—, ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค. OAuth 1.0์€ ์ด ๊ฒฝ์šฐ ํŠธ์œ„ํ„ฐ ๋‹จ๋ง ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ (consumer)์—๊ฒŒ ์ธ์ฆํ† ํฐ(access token)๋งŒ์„ ์ „๋‹ฌํ•˜๊ณ  ๋‹จ๋ง ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ธ์ฆํ† ํฐ์œผ๋กœ ํŠธ์œ„ํ„ฐ API(service provider)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค.

์ธ์ฆํ† ํฐ

OAuth 1.0a ์ธ์ฆ์ด ์™„๋ฃŒ๊ฐ€ ๋˜๋ฉด ์ปจ์Šˆ๋จธ (์˜ˆ๋ฅผ ๋“ค๋ฉด ํŠธ์œ„ํ„ฐ ๋ชจ๋ฐ”์ผ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜)์€ ์‚ฌ์šฉ์ž์˜ ์•„์ด๋””/ํŒจ์Šค์›Œ๋“œ๋ฅผ ์ง์ ‘ ์ €์žฅํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ธ์ฆํ† ํฐ(access token)์„ ๋ฐ›๊ฒŒ ๋œ๋‹ค. ์ด ์ธ์ฆ ํ† ํฐ์€ OAuth 2.0์—์„œ๋„ ๊ฐ™์€ ๊ฐœ๋…์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ์ธ์ฆํ† ํฐ์€ ์ปค๋ฒ ๋กœ์Šค(Kerberos)์˜ ํ‹ฐ์ผ“ ๊ฐœ๋…๊ณผ ๋น„์Šทํ•˜๋‹ค๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์•„๋ž˜์™€ ๊ฐ™์€ ํŠน์ง•์„ ๊ฐ€์ง„๋‹ค.

  1. ์ปจ์Šˆ๋จธ๊ฐ€ ์•„์ด๋””/ํŒจ์Šค์›Œ๋“œ๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๊ณ  API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  2. ํ•„์š”ํ•œ API์—๋งŒ ์ œํ•œ์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ถŒํ•œ ์ œ์–ด ๊ฐ€๋Šฅ
  3. ์‚ฌ์šฉ์ž๊ฐ€ ์„œ๋น„์Šค ํ”„๋กœ๋ฐ”์ด๋”์˜ ๊ด€๋ฆฌ ํŽ˜์ด์ง€์—์„œ ๊ถŒํ•œ ์ทจ์†Œ ๊ฐ€๋Šฅ
  4. ํŒจ์Šค์›Œ๋“œ ๋ณ€๊ฒฝ ์‹œ์—๋„ ์ธ์ฆ ํ† ํฐ์€ ๊ณ„์† ์œ ํšจํ•จ.

OAuth 2.0

OAuth 2.0 ํ”Œ๋กœ์šฐ

OAuth 2.0 spec ๊ตฌ์„ฑ

ํ˜„์žฌ OAuth ๋Š” oauth-v2 ์™€ oauth-v2-bearer ๋ผ๋Š” 2๊ฐœ์˜ ํ‘œ์ค€์ด ๊ฐ€์žฅ ํ•ต์‹ฌ์ ์ธ ๋ถ€๋ถ„์ด๋ฉฐ ํ˜„์žฌ RFC์— ๋“ฑ๋ก๋˜๊ธฐ ์œ„ํ•œ ๊ณผ์ •์„ ๋ฐŸ๊ณ  ์žˆ๋Š” ์ค‘์ด๋‹ค. ๋Œ€๋ถ€๋ถ„ โ€œOAuth 2.0 ์ง€์›โ€์ด๋ผ๊ณ  ํ•˜๋Š” ์„œ๋น„์Šค ๋“ค์€ ์ด 2๊ฐ€์ง€ spec์„ ์ง€์›ํ•œ ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์ด ์™ธ์—๋„ SAML, JSON ์›น ํ† ํฐ, MAC ํ† ํฐ ๋“ฑ์˜ ๋ฐฉ์‹์ด ์žˆ์ง€๋งŒ ์•„์ง ํ™œ๋ฐœํžˆ ์ˆ˜์ • ์ค‘ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ ์„œ๋น„์Šค์—์„œ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์ง€๋Š” ์•Š๋‹ค.

OAuth 2.0์˜ ๋ฒ„์ „๋“ค

API ์„œ๋น„์Šค๋ฅผ ์ผ์ฐ ์‹œ์ž‘ํ•œ ํšŒ์‚ฌ๋“ค์€ ๊ธฐ์กด์˜ OAuth 1.0a ๋ฅผ ๊ณ„์† ์œ ์ง€ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ๋งŽ์ด ์žˆ๋‹ค. 1.0a์™€ 2.0์„ ์‚ฌ์šฉํ•˜๋Š” ์•Œ๋ ค์ง„ ์„œ๋น„์Šค ๋“ค์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

๋‹ค์–‘ํ•œ ์ธ์ฆ ๋ฐฉ์‹ (Grant types)

์•ž์—์„œ OAuth 1.0a๊ฐ€ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์‚ฌ์šฉ์ž, ์ปจ์Šˆ๋จธ, ์„œ๋น„์Šค ํ”„๋กœ๋ฐ”์ด๋”๊ฐ€ ํ•„์š”ํ•˜๊ณ  3-legged OAuth ๋ผ๊ณ  ๋ถˆ๋ฆฌ์šฐ๊ธฐ๋„ ํ•œ๋‹ค๊ณ  ํ•˜์˜€์ง€๋งŒ, OAuth 2.0์€ 2-legged ๋ชจ๋ธ ๋“ฑ ๋‹ค์–‘ํ•œ ์ธ์ฆ ๋ฐฉ์‹์„ ์ง€์›ํ•œ๋‹ค. 3-legged ๋ชจ๋ธ์˜ ์žฅ์ ์€ ์ตœ์ข… ์‚ฌ์šฉ์ž ๋ฟ ์•„๋‹ˆ๋ผ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€๋„ ์ธ์ฆํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด API๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ํ†ต๊ณ„/๊ณผ๊ธˆ ์„ ์œ„ํ•œ ํ•„์ˆ˜์ ์ธ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค. user-agent ๋‚˜ referer ๊ฐ™์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์ด ์•„๋‹Œ ์ธ์ฆ์„ ํ†ตํ•ด ํ™•์‹คํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๊ฐ€ API๋ฅผ ๋น„์ •์ƒ์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ๋‹ค๊ฑฐ๋‚˜ ํ•  ๋•Œ ๊ฐœ๋ฐœ์ž์™€ ์ง์ ‘ ์—ฐ๋ฝํ•˜๋Š” ๋“ฑ์˜ ์กฐ์น˜๋ฅผ ์ทจํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ์™€ ๊ฐ™์€ OAuth์—์„œ ํ•„์š”๋กœํ•˜๋Š” ๋™์ž‘์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค, ๋‘˜์ด์„œ๋งŒ ์ธ์ฆํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค ๋“ฑ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด OAuth 2.0์€ 2-legged ๋ชจ๋ธ๋„ ์ง€์›ํ•˜๋‚˜, ๊ทธ๋ž˜๋„ OAuth 2.0์—์„œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š” ๊ฒƒ์€ 3-legged ๋ชจ๋ธ์ด๋‹ค.

Client ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Confidential Client ์™€ Public Client ๋กœ ๋‚˜๋‰œ๋‹ค.

  • Confidential ํด๋ผ์ด์–ธํŠธ๋Š” ์›น ์„œ๋ฒ„๊ฐ€ API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ ๋“ฑ๊ณผ ๊ฐ™์ด client ์ฆ๋ช…์„œ(client_secret)๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณด๊ด€ํ•  ์ˆ˜ ์žˆ๋Š” Client๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
  • Public Client๋Š” ๋ธŒ๋ผ์šฐ์ €๊ธฐ๋ฐ˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‚˜ ๋ชจ๋ฐ”์ผ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ™์ด client ์ฆ๋ช…์„œ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณด๊ด€ํ•  ์ˆ˜ ์—†๋Š” Client๋ฅผ ์˜๋ฏธํ•˜๋Š”๋ฐ ์ด๋Ÿฐ ๊ฒฝ์šฐ redirect_uri ๋ฅผ ํ†ตํ•ด์„œ client๋ฅผ ์ธ์ฆํ•œ๋‹ค.

OAuth 2.0์ด ์ง€์›ํ•˜๋Š” ์ธ์ฆ๋ฐฉ์‹์€ client ์ข…๋ฅ˜์™€ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋”ฐ๋ผ ์•„๋ž˜ 4๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ Authorization Code Grant์™€ Implicit Grant๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ์ผ๋ฐ˜์ ์ธ 3-legged OAuth ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— open API์—์„œ๋Š” ๋งŽ์ด ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

  1. Authorization Code Grant

์›น ์„œ๋ฒ„์—์„œ API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋“ฑ์˜ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ Confidential Client๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์„œ๋ฒ„์‚ฌ์ด๋“œ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•œ ์ธ์ฆ ๋ฐฉ์‹์ด๋ฉฐ ์ธ์ฆ ๊ณผ์ •์—์„œ client_secret ์ด ํ•„์š”ํ•˜๋‹ค. ๋กœ๊ทธ์ธ์‹œ์— ํŽ˜์ด์ง€ URL์— response_type=code ๋ผ๊ณ  ๋„˜๊ธด๋‹ค.

  1. Implicit Grant

token๊ณผ scope์— ๋Œ€ํ•œ ์ŠคํŽ™ ๋“ฑ์€ ๋‹ค๋ฅด์ง€๋งŒ OAuth 1.0a๊ณผ ๊ฐ€์žฅ ๋น„์Šทํ•œ ์ธ์ฆ๋ฐฉ์‹์ด๋‹ค. Public Client์ธ ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ฐ˜์˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜(Javascript application)์ด๋‚˜ ๋ชจ๋ฐ”์ผ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ด ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. Client ์ฆ๋ช…์„œ๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ์‹ค์ œ๋กœ OAuth 2.0์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ๋กœ๊ทธ์ธ์‹œ์— ํŽ˜์ด์ง€ URL์— response_type=token ๋ผ๊ณ  ๋„˜๊ธด๋‹ค.

  1. Password Credentials Grant

์ด ๋ฐฉ์‹์€ 2-legged ๋ฐฉ์‹์˜ ์ธ์ฆ์ด๋‹ค. Client์— ์•„์ด๋””/ํŒจ์Šค์›Œ๋“œ๋ฅผ ์ €์žฅํ•ด ๋†“๊ณ  ์•„์ด๋””/ํŒจ์Šค์›Œ๋“œ๋กœ ์ง์ ‘ access token์„ ๋ฐ›์•„์˜ค๋Š” ๋ฐฉ์‹์ด๋‹ค. Client ๋ฅผ ๋ฏฟ์„ ์ˆ˜ ์—†์„ ๋•Œ์—๋Š” ์‚ฌ์šฉํ•˜๊ธฐ์— ์œ„ํ—˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— API ์„œ๋น„์Šค์˜ ๊ณต์‹ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‚˜ ๋ฏฟ์„ ์ˆ˜ ์žˆ๋Š” Client์— ํ•œํ•ด์„œ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค. ๋กœ๊ทธ์ธ์‹œ์— API์— POST๋กœ grant_type=password ๋ผ๊ณ  ๋„˜๊ธด๋‹ค.

  1. Client Credentials Grant

์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด Confidential Client์ผ ๋•Œ id์™€ secret์„ ๊ฐ€์ง€๊ณ  ์ธ์ฆํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ๋กœ๊ทธ์ธ์‹œ์— API์— POST๋กœ grant_type=client_credentials ๋ผ๊ณ  ๋„˜๊ธด๋‹ค.

  1. Extension

OAuth 2.0์€ ์ถ”๊ฐ€์ ์ธ ์ธ์ฆ๋ฐฉ์‹์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธธ์„ ์—ด์–ด๋†“์•˜๋‹ค. ์ด๋Ÿฐ ๊ณผ๋„ํ•œ ํ™•์žฅ์„ฑ์„ ๋ฉ”์ธ ์—๋””ํ„ฐ์ธ Eran Hammer๋Š” ๋งค์šฐ ์‹ซ์–ดํ–ˆ๋‹ค๊ณ  ํ•œ๋‹ค.

Password Credentials Grant์™€ Client Credentials Grant๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์šฐ๋ฆฌ๊ฐ€ ์ƒ๊ฐํ•˜๋Š” OAuth ์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋”ฐ๋ฅด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋“œ์‹œ ์ธ์ฆ๋œ client์—๋งŒ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•˜๋ฉฐ ๊ฐ€๋Šฅํ•˜๋ฉด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๋‹ค์–‘ํ•œ ํ† ํฐ ์ง€์›(Access token)

OAuth 2.0์€ ๊ธฐ๋ณธ์ ์œผ๋กœ Bearer ํ† ํฐ, ์ฆ‰ ์•”ํ˜ธํ™”ํ•˜์ง€ ์•Š์€ ๊ทธ๋ƒฅ ํ† ํฐ์„ ์ฃผ๊ณ ๋ฐ›๋Š” ๊ฒƒ์œผ๋กœ ์ธ์ฆ์„ ํ•œ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ HTTPS ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ† ํฐ์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ฃผ๊ณ ๋ฐ›๋Š” ๊ฒƒ์€ HTTPS์˜ ์•”ํ˜ธํ™”์— ์˜์กดํ•œ๋‹ค. ๋˜ํ•œ ๋ณต์žกํ•œ signature ๋“ฑ์„ ์ƒ์„ฑํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— curl์ด API๋ฅผ ํ˜ธ์ถœ ํ•  ๋•Œ ๊ฐ„๋‹จํ•˜๊ฒŒ Header ์— ์•„๋ž˜์™€ ๊ฐ™์ด ํ•œ ์ค„์„ ๊ฐ™์ด ๋ณด๋‚ด๋ฏ€๋กœ์„œ API๋ฅผ ํ…Œ์ŠคํŠธํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Authorization: Bearer

๋˜ํ•œ OAuth 2.0์€ MAC ํ† ํฐ๊ณผ SAML ํ˜•์‹์˜ ํ† ํฐ์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ˜„์žฌ MAC ํ† ํฐ ์ŠคํŽ™์€ ์—…๋ฐ์ดํŠธ ๋˜์ง€ ์•Š์•„ ๊ธฐํ•œ ๋งŒ๋ฃŒ๋œ ์ƒํƒœ์ด๊ณ  SAML ํ† ํฐ ํ˜•์‹๋„ ์•„์ง์€ ํ™œ๋ฐœํ•˜๊ฒŒ ์ˆ˜์ •์ค‘์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์ƒํƒœ์ด๋‹ค. ์ •๋ฆฌํ•˜์ž๋ฉด, OAuth 2.0์€ ๋‹ค์–‘ํ•œ ํ† ํฐ ํƒ€์ž…์„ ์ง€์›ํ•œ์ง€๋งŒ ์‹ค์งˆ์ ์œผ๋กœ๋Š” Bearer ํ† ํฐ ํƒ€์ž…๋งŒ ์ง€์›ํ•œ๋‹ค.

Refresh token

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐ™์€ access token์„ ์˜ค๋ž˜ ์‚ฌ์šฉํ•˜๋ฉด ๊ฒฐ๊ตญ์€ ํ•ดํ‚น์— ๋…ธ์ถœ๋  ์œ„ํ—˜์ด ๋†’์•„์ง„๋‹ค. ๊ทธ๋ž˜์„œ OAuth 2.0์—์„œ๋Š” refresh token ์ด๋ผ๋Š” ๊ฐœ๋…์„ ๋„์ž…ํ–ˆ๋‹ค. ์ฆ‰, ์ธ์ฆ ํ† ํฐ(access token)์˜ ๋งŒ๋ฃŒ๊ธฐ๊ฐ„์„ ๊ฐ€๋Šฅํ•œ ์งง๊ฒŒ ํ•˜๊ณ  ๋งŒ๋ฃŒ๊ฐ€ ๋˜๋ฉด refresh token์œผ๋กœ access token์„ ์ƒˆ๋กœ ๊ฐฑ์‹ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ๊ฐœ๋ฐœ์ž๋“ค ์‚ฌ์ด์—์„œ๋Š” ๋…ผ๋ž€์ด ์žˆ๋Š”๋ฐ, ํ† ํฐ์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•ด์•ผ ํ•ด์„œ ๊ฐœ๋ฐœ์ด ๋ณต์žกํ•ด ์งˆ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜๋ฉด ๋‹ค์‹œ ๋กœ๊ทธ์ธ ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ๋ณด์•ˆ ๋ฉด์—์„œ๋„ ์•ˆ์ „ํ•˜๋‹ค๋Š” ์˜๊ฒฌ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

API ๊ถŒํ•œ ์ œ์–ด (scope)

OAuth 2.0์€ ์จ๋“œํŒŒํ‹ฐ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ถŒํ•œ์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ์ด๋‹ค. scope์˜ ์ด๋ฆ„์ด ์ŠคํŽ™์— ์ •์˜๋˜์–ด์žˆ์ง€๋Š” ์•Š์œผ๋ฉฐ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ถŒํ•œ์„ ์š”์ฒญํ•  ๋•Œ์—๋Š” ์ฝค๋งˆ๋“ฑ์„ ์‚ฌ์šฉํ•ด์„œ ๋กœ๊ทธ์ธ ์‹œ์— scope๋ฅผ ๋„˜๊ฒจ์ฃผ๊ฒŒ ๋œ๋‹ค. http://example.com/oauth?โ€ฆ.&scope=read_article,update_profile

๋‹ค์Œ์€ ์„ค๊ณ„์— ์žˆ์–ด ๋˜ํ•˜๋‚˜์˜ ๊ณ ๋ ค ๋ฐฉ์•ˆ์ธ OpenSSO ๋ฅผ ์‚ดํŽด๋ณด๋„๋ก ํ•œ๋‹ค.

OpenSSO

OpenSSO ํ†ตํ•ฉ์ธ์ฆ ์ฒ˜๋ฆฌ ํ”Œ๋กœ์šฐ

OpenSSO Policy ๊ตฌ์„ฑ

  • Rules

  • Subjects

  • Conditions

  • Response Providers

Rules

Discovery Service (with resource name)

Discovery Service (with resource name) allows administrators to create and manage policies corresponding to the LOOKUP and UPDATE actions that can be performed on the Discovery Service.

  • LOOKUP

Allow: Enables access to the resource defined in the Rule.

Deny: Denies access to the resource defined in the Rule.

  • UPDATE

Allow: Enables access to the resource defined in the Rule.

Deny: Denies access to the resource defined in the Rule.

Liberty Personal Profile Service (with resource name)

Liberty Personal Profile Service (with resource name) allows administrators to create and manage policies corresponding to the MODIFY and QUERY actions that can be performed on the Liberty Personal Profile Service.

  • MODIFY

Interact for Value: Invokes the Liberty Alliance Project Interaction protocol for a value on a resource.

Interact for Consent: Invokes the Liberty Alliance Project Interaction protocol for consent on a resource.

Allow: Enables access to the resource defined in the Rule.

Deny: Denies access to the resource defined in the Rule.

  • QUERY

Interact for Value: Invokes the Liberty Alliance Project Interaction protocol for a value on a resource.

Interact for Consent: Invokes the Liberty Alliance Project Interaction protocol for consent on a resource.

Allow: Enables access to the resource defined in the Rule.

Deny: Denies access to the resource defined in the Rule.

URL Policy Agent (with resource name)

URL Policy Agent (with resource name) allows administrators to create and manage policies for policy agents that enforce decisions on http/http(s) URLs.

  • GET

Allow: Enables access to the resource defined in the Rule.

Deny: Denies access to the resource defined in the Rule.

  • POST

Allow: Enables access to the resource defined in the Rule.

Deny: Denies access to the resource defined in the Rule.

๋‹ค์Œ์€ ์ธ์ฆ๋ฐฉ์‹์˜ ํ† ํฐ ์œ ํ˜•์œผ๋กœ ๊ณ ๋ ค์ค‘์ธ JWT ๋ฅผ ์‚ดํŽด๋ณด๋„๋ก ํ•œ๋‹ค.

JWT

์ถœ์ฒ˜ : http://bcho.tistory.com/999

Claim๊ธฐ๋ฐ˜ ํ† ํฐ์˜ ๊ฐœ๋…

OAuth์— ์˜ํ•ด์„œ ๋ฐœ๊ธ‰๋˜๋Š” access_token์€ random string์œผ๋กœ ํ† ํฐ ์ž์ฒด์—๋Š” ํŠน๋ณ„ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋Š” ์ผ๋ฐ˜์ ์ธ ์ŠคํŠธ๋ง ํ˜•ํƒœ ์ด๋‹ค. ์•„๋ž˜๋Š” ํŽ˜์ด์Šค๋ถ์—์„œ ๋ฐœ๊ธ‰๋œ access_token์˜ ํ˜•ํƒœ๋กœ ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ž์—ด ํ˜•ํƒœ์ž„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

{
  "id":"terry"
  ,"role":["admin","user"]
  ,"company":"pepsi"
}

API๋‚˜ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ์„œ๋ฒ„ ์ž…์žฅ์—์„œ ๊ทธ access_token์„ ํ†ตํ•ด์„œ ์‚ฌ์šฉ์ž์— ์—ฐ๊ด€๋œ ๊ถŒํ•œ(์˜ˆ๋ฅผ ๋“ค์–ด scope๊ฐ™์€ ๊ฒƒ)์„ ์‹๋ณ„ํ•œ ๋’ค ๊ถŒํ•œ์„ ํ—ˆ์šฉํ•ด์ฃผ๋Š” ๊ตฌ์กฐ์ด๋‹ค. ์ฆ‰ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ž…์žฅ์—์„œ๋Š” ํ† ํฐ์„ ๊ฐ€์ง€๊ณ  ๊ทธ ํ† ํฐ๊ณผ ์—ฐ๊ด€๋œ ์ •๋ณด๋ฅผ ์„œ๋ฒ„์ชฝ์—์„œ ์ฐพ์•„์•ผ ํ•œ๋‹ค. (์‚ฌ์šฉ์ž ID๋‚˜ ๊ถŒํ•œ๋“ฑ). JWT๋Š” Claim ๊ธฐ๋ฐ˜์ด๋ผ๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, Claim์ด๋ผ๋Š” ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ํ”„๋กœํผํ‹ฐ๋‚˜ ์†์„ฑ์„ ์ด์•ผ๊ธฐ ํ•œ๋‹ค. ํ† ํฐ์ž์ฒด๊ฐ€ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฐฉ์‹์ธ๋ฐ, JWT๋Š” ์ด Claim์„ JSON์„ ์ด์šฉํ•ด์„œ ์ •์˜ํ•œ๋‹ค. ๋‹ค์Œ์€ Claim์„ JSON์œผ๋กœ ์„œ์ˆ ํ•œ ์˜ˆ์ด๋‹ค.์ด JSON ์ž์ฒด๋ฅผ ํ† ํฐ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด Claim ๊ธฐ๋ฐ˜์˜ ํ† ํฐ ๋ฐฉ์‹์ด๋‹ค.

์ด๋Ÿฌํ•œ Claim ๋ฐฉ์‹์˜ ํ† ํฐ์€ ๋ฌด์—‡์ด ์ข‹์„๊นŒ? ์ด ํ† ํฐ์„ ์ด์šฉํ•ด์„œ ์š”์ฒญ์„ ๋ฐ›๋Š” ์„œ๋ฒ„๋‚˜ ์„œ๋น„์Šค ์ž…์žฅ์—์„œ๋Š” ์ด ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•œ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด๋Š” ์ด๋ฏธ ํ† ํฐ์•ˆ์— ๋‹ค ๋“ค์–ด๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๊ณณ์—์„œ ๊ฐ€์ ธ์˜ฌ ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. โ€œ์‚ฌ์šฉ์ž ๊ด€๋ฆฌโ€ ๋ผ๋Š” API ์„œ๋น„์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋‹ค. ์ด API๋Š” โ€œ๊ด€๋ฆฌ์ž(admin)โ€ ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์‚ฌ์šฉ์ž๋งŒ์ด ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, โ€œ๊ด€๋ฆฌ์žโ€ ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์‚ฌ์šฉ์ž๋Š” ๊ทธ ๊ด€๋ฆฌ์ž๊ฐ€ ์†ํ•ด ์žˆ๋Š” โ€œํšŒ์‚ฌ(company)โ€์˜ ์‚ฌ์šฉ์ž ์ •๋ณด๋งŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ผ๊ณ  ์ •์˜ํ•˜์ž ์ด ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•ด์„œ ์ผ๋ฐ˜์ ์ธ ์ŠคํŠธ๋ง ๊ธฐ๋ฐ˜์˜ ํ† ํฐ๊ณผ JWT์™€ ๊ฐ™์€ Claim ๊ธฐ๋ฐ˜์˜ ํ† ํฐ์ด ์–ด๋–ค ์ฐจ์ด๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์ง€ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž.

OAuth ํ† ํฐ์˜ ๊ฒฝ์šฐ

  1. API ํด๋ผ์ด์–ธํŠธ๊ฐ€ Authorization Server (ํ† ํฐ ๋ฐœ๊ธ‰์„œ๋ฒ„)๋กœ ํ† ํฐ์„ ์š”์ฒญํ•œ๋‹ค. ์ด๋•Œ, ํ† ํฐ ๋ฐœ๊ธ‰์„ ์š”์ฒญํ•˜๋Š” ์‚ฌ์šฉ์ž์˜ ๊ณ„์ •๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋„˜๊ธฐ๊ณ , ์ด์™€ ํ•จ๊ป˜ ํ† ํฐ์˜ ๊ถŒํ•œ(์šฉ๋„)์„ ์š”์ฒญํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž ๊ถŒํ•œ(enduser)๊ณผ ๊ด€๋ฆฌ์ž ๊ถŒํ•œ(admin)์„ ๊ฐ™์ด ์š”์ฒญํ•˜์˜€๋‹ค.
  2. ํ† ํฐ ์ƒ์„ฑ ์š”์ฒญ์„ ๋ฐ›์€ Authorization Server๋Š” ์‚ฌ์šฉ์ž ๊ณ„์ •์„ ํ™•์ธํ•œ ํ›„, ์ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์š”์ฒญ๋œ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ด๋„ ๋˜๋Š”์ง€ ๊ณ„์ • ์‹œ์Šคํ…œ๋“ฑ์— ๋ฌผ์–ด๋ณธ ํ›„, ์‚ฌ์šฉ์ž์—๊ฒŒ ํ•ด๋‹น ํ† ํฐ์„ ๋ฐœ๊ธ‰์ด ๊ฐ€๋Šฅํ•˜๋ฉด ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•˜๊ณ , ํ† ํฐ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‚ด๋ถ€(ํ† ํฐ ์ €์žฅ์†Œ)์— ์ €์žฅํ•ด๋†“๋Š”๋‹ค.
  3. ์ด๋ ‡๊ฒŒ ์ƒ์„ฑ๋œ ํ† ํฐ์€ API ํด๋ผ์ด์–ธํŠธ๋กœ ์ €์žฅ๋œ๋‹ค.
  4. API ํด๋ผ์ด์–ธํŠธ๋Š” API๋ฅผ ํ˜ธ์ถœํ• ๋•Œ ์ด ํ† ํฐ์„ ์ด์šฉํ•ด์„œ Resource Server(API ์„œ๋ฒ„)์— ์žˆ๋Š” API๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
  5. ์ด๋•Œ ํ˜ธ์ถœ๋˜๋Š” API๋Š” ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, Resource Server๊ฐ€ ํ† ํฐ ์ €์žฅ์†Œ์—์„œ ํ† ํฐ์— ๊ด€๋ จ๋œ ์‚ฌ์šฉ์ž ๊ณ„์ •, ๊ถŒํ•œ ๋“ฑ์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์˜จ๋‹ค. ์ด ํ† ํฐ์— (๊ด€๋ฆฌ์ž)admin ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, API ํ˜ธ์ถœ์„ ํ—ˆ์šฉํ•œ๋‹ค. ์œ„์— ์ •์˜ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ๊ทธ ์‚ฌ์šฉ์ž๊ฐ€ ์†ํ•œ โ€œํšŒ์‚ฌโ€์˜ ์‚ฌ์šฉ์ž ์ •๋ณด๋งŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ผ๋Š” ์ „์ œ ์กฐ๊ฑด์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, API ์„œ๋ฒ„๋Š” ์ถ”๊ฐ€๋กœ ์‚ฌ์šฉ์ž ๋ฐ์ดํƒ€ ๋ฒ ์ด์Šค์—์„œ ์ด ์‚ฌ์šฉ์ž๊ฐ€ ์†ํ•œ โ€œํšŒ์‚ฌโ€ ์ •๋ณด๋ฅผ ์ฐพ์•„์™€์•ผํ•œ๋‹ค.
  6. API์„œ๋ฒ„๋Š” ์‘๋‹ต์„ ๋ณด๋‚ธ๋‹ค.

JWT์™€ ๊ฐ™์€ Claim ๊ธฐ๋ฐ˜์˜ ํ† ํฐ ํ๋ฆ„

  1. ํ† ํฐ์„ ์ƒ์„ฑ ์š”์ฒญํ•˜๋Š” ๋ฐฉ์‹์€ ๋™์ผํ•˜๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์‚ฌ์šฉ์ž๋ฅผ ์ธ์ฆํ•œ๋‹ค์Œ์—, ํ† ํฐ์„ ์ƒ์„ฑํ•œ๋‹ค.
  2. ๋‹ค๋ฅธ ์ ์€ ์ƒ์„ฑ๋œ ํ† ํฐ์— ๊ด€๋ จ๋œ ์ •๋ณด๋ฅผ ๋ณ„๋„๋กœ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ํ† ํฐ์— ์—ฐ๊ด€๋˜๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด๋‚˜ ๊ถŒํ•œ๋“ฑ์„ ํ† ํฐ ์ž์ฒด์— ๋„ฃ์–ด์„œ ์ €์žฅํ•œ๋‹ค.
  3. API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹๋„ ๋™์ผํ•˜๋‹ค.
  4. Resource Server (API ์„œ๋ฒ„)๋Š” ํ† ํฐ ๋‚ด์— ๋“ค์–ด ์žˆ๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ๊ถŒํ•œ ์ธ๊ฐ€ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ฐจ์ด์ ์€ ํ† ํฐ์„ ์ƒ์„ฑํ•˜๋Š” ๋‹จ๊ณ„์—์„œ๋Š” ์ƒ์„ฑ๋œ ํ† ํฐ์„ ๋ณ„๋„๋กœ ์„œ๋ฒ„์—์„œ ์œ ์ง€ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ํ† ํฐ์„ ์‚ฌ์šฉํ•˜๋Š” API ์„œ๋ฒ„ ์ž…์žฅ์—์„œ๋Š” API ์š”์ฒญ์„ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ† ํฐ์„ ๊ฐ€์ง€๊ณ  ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋ณ„๋„๋กœ ๊ณ„์ • ์‹œ์Šคํ…œ ๋“ฑ์—์„œ ์กฐํšŒํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

Claim (๋ฉ”์„ธ์ง€) ์ •์˜

JWT๋Š” Claim์„ JSONํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ธ๋ฐ, JSON์€ โ€œ\nโ€๋“ฑ ๊ฐœํ–‰๋ฌธ์ž๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, REST API ํ˜ธ์ถœ์‹œ HTTP Header๋“ฑ์— ๋„ฃ๊ธฐ๊ฐ€ ๋งค์šฐ ๋ถˆํŽธํ•˜๋‹ค. ๊ทธ๋ž˜์„œ, JWT์—์„œ๋Š” ์ด Claim JSON ๋ฌธ์ž์—ด์„ BASE64 ์ธ์ฝ”๋”ฉ์„ ํ†ตํ•ด์„œ ํ•˜๋‚˜์˜ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

{
  "id":"terry"
  ,"role":["admin","user"]
  ,"company":"pepsi"
}

๋ฌธ์ž์—ด์„ BASE64 ์ธ์ฝ”๋”ฉ ํ•œ ๊ฒฐ๊ณผ ew0KICAiaWQiOiJ0ZXJyeSINCiAgLCJyb2xlIjpbImFkbWluIiwidXNlciJdDQogICwiY29tcGFueSI6InBlcHNpIg0KfQ0K

๋ณ€์กฐ ๋ฐฉ์ง€

์œ„์˜ Claim ๊ธฐ๋ฐ˜์˜ ํ† ํฐ์„ ๋ดค์œผ๋ฉด, ์ฒซ๋ฒˆ์งธ ๋“ค ์ˆ˜ ์žˆ๋Š” ์˜๋ฌธ์ด ํ† ํฐ์„ ๋ฐ›์€ ๋‹ค์Œ์— ๋ˆ„๊ตฐ๊ฐ€ ํ† ํฐ์„ ๋ณ€์กฐํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ง‰๋А๋ƒ? ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ๋ฉ”์„ธ์ง€๊ฐ€ ๋ณ€์กฐ ๋˜์ง€ ์•Š์•˜์Œ์„ ์ฆ๋ช…ํ•˜๋Š” ๊ฒƒ์„ ๋ฌด๊ฒฐ์„ฑ(Integrity)๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ค‘ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ๋ฒ•์ด ์„œ๋ช…(Signature)์ด๋‚˜ HMAC ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ฆ‰ ์›๋ณธ ๋ฉ”์„ธ์ง€์—์„œ ํ•ด์‰ฌ๊ฐ’์„ ์ถ”์ถœํ•œ ํ›„, ์ด๋ฅผ ๋น„๋ฐ€ ํ‚ค๋ฅผ ์ด์šฉํ•ด์„œ ๋ณตํ˜ธํ™” ์‹œ์ผœ์„œ ํ† ํฐ์˜ ๋’ค์— ๋ถ™์ธ๋‹ค. ์ด๊ฒŒ HMAC๋ฐฉ์‹์ธ๋ฐ, ๋ˆ„๊ตฐ๊ฐ€ ์ด ๋ฉ”์„ธ์ง€๋ฅผ ๋ณ€์กฐ๋ฅผ ํ–ˆ๋‹ค๋ฉด,๋ณ€์กฐ๋œ ๋ฉ”์„ธ์ง€์—์„œ ์ƒ์„ฑํ•œ ํ•ด์‰ฌ๊ฐ’๊ณผ ํ† ํฐ๋’ค์— ๋ถ™์–ด ์žˆ๋Š” HMAC๊ฐ’์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์„ธ์ง€๊ฐ€ ๋ณ€์กฐ๋˜์—ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋ฅธ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋ฉ”์„ธ์ง€๋ฅผ ๋ณ€์กฐํ•œํ›„์—, ์ƒˆ๋กญ๊ฒŒ HMAC๊ฐ’์„ ๋งŒ๋“ค์–ด๋‚ด๋ ค๊ณ  ํ•˜๋”๋ผ๋„, HAMC์€ ์•ž์˜ ๋น„๋ฐ€ํ‚ค๋ฅผ ์ด์šฉํ•ด์„œ ๋ณตํ˜ธํ™” ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ด ๋น„๋ฐ€ํ‚ค๋ฅผ ์•Œ ์ˆ˜ ์—†๋Š” ์ด์ƒ HMAC์„ ๋งŒ๋“ค์–ด ๋‚ผ ์ˆ˜ ์—†๋‹ค.

โ€ป HMAC์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์€http://bcho.tistory.com/807 ๋ฅผ ์ฐธ๊ณ ํ•˜๊ธฐ ๋ฐ”๋ž€๋‹ค. ๊ทธ๋ž˜์„œ ์•ž์˜ JSON ๋ฉ”์„ธ์ง€์— ๋Œ€ํ•ด์„œ SHA-256์ด๋ผ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•ด์„œ ๋น„๋ฐ€ํ‚ค๋ฅผ โ€œsecretโ€ ์ด๋ผ๊ณ  ํ•˜๊ณ , HMAC์„ ์ƒ์„ฑํ•˜๋ฉด ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

i22mRxfSB5gt0rLbtrogxbKj5aZmpYh7lA82HO1Di0E

์„œ๋ช… ์ƒ์„ฑ ๋ฐฉ์‹

๊ทธ๋Ÿฌ๋ฉด ๋ฌด๊ฒฐ์„ฑ ๋ณด์žฅ์„ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด SHA1-256 HMAC ๋ฟ์ผ๊นŒ? ๋ณด์•ˆ์š”๊ฑด์— ๋”ฐ๋ผ์„œ SHA1-256,384,512. ๊ทธ๋ฆฌ๊ณ  ๊ณต์ธ ์ธ์ฆ์„œ (Ceritification)์„ ์ด์šฉํ•œ RS256 ๋“ฑ๋“ฑ ๋‹ค์–‘ํ•œ ์„œ๋ช… ๋ฐฉ์‹์„ ์ง€์›ํ•œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด JWT ํ† ํฐ์ด ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์„œ๋ช…์ด ๋˜์–ด ์žˆ๋Š”์ง€๋Š” ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์„๊นŒ? ๊ทธ๋ž˜์„œ JWT ํ† ํฐ์˜ ๋งจ ์•ž๋ถ€๋ถ„์—๋Š” ์„œ๋ช…์— ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ–ˆ๋Š”์ง€๋ฅผ JSONํ˜•ํƒœ๋กœ ์ •์˜ํ•œํ›„, ์ด JSON์„ ๋‹ค์‹œ BASE64 ๋ฐฉ์‹์œผ๋กœ ์ธ์ฝ”๋”ฉํ•œ ๋ฌธ์ž์—ด์„ ๋ถ™์ธ๋‹ค

{"alg":"HS256","typ":"JWT"}
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

์ „์ฒด ๋ฉ”์„ธ์ง€ ํฌ๋งท

์œ„์—์„œ ์„ค๋ช…ํ•œ, ์„œ๋ช… ๋ฐฉ์‹, JSON ๊ธฐ๋ฐ˜์˜ Claim,๊ทธ๋ฆฌ๊ณ  ์„œ๋ช…(Signature)๊นŒ์ง€ ํฌํ•จ๋œ ์ „์ฒด์ ์ธ JWT ํ† ํฐ์˜ ๊ตฌ์กฐ๋ฅผ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. {์„œ๋ช… ๋ฐฉ์‹์„ ์ •์˜ํ•œ JSON์„ BASE64 ์ธ์ฝ”๋”ฉ}.{JSON Claim์„ BASE64 ์ธ์ฝ”๋”ฉ}.{JSON Claim์— ๋Œ€ํ•œ ์„œ๋ช…} ์ด๋ฅผ ์ •๋ฆฌํ•ด์„œ ๊ทธ๋ฆผ์œผ๋กœ ์„œ์ˆ ํ•ด ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

๊ทธ๋ฆฌ๊ณ  ๊ฒฐ๊ณผ๋กœ ๋‚˜์˜จ, JWT ํ† ํฐ์€ eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.ew0KICAiaWQiOiJ0ZXJyeSINCiAgLCJyb2xlIjpbImFkbWluIiwidXNlciJdDQogICwiY29tcGFueSI6InBlcHNpIg0KfQ0K.i22mRxfSB5gt0rLbtrogxbKj5aZmpYh7lA82HO1Di0E ๊ฐ€ ๋œ๋‹ค.

๋ฌธ์ œ์ 

์‚ฌ์šฉ์ด ์‰ฝ๊ณ , ์„œ๋ฒ„์˜ ๊ฐœ๋ฐœ ๋ถ€๋‹ด์„ ๋œ์–ด์ค„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์žฅ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋‚˜, ๊ทธ๋งŒํผ ๋˜ ๋‹จ์ ๋„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

  • ๊ธธ์ด

Claim์— ๋„ฃ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์•„์งˆ ์ˆ˜ ๋ก, JWT ํ† ํฐ์˜ ๊ธธ์ด๊ฐ€ ๊ธธ์–ด์ง„๋‹ค. API ํ˜ธ์ถœ๋“ฑ์— ์‚ฌ์šฉํ•  ์‹œ์—,๋งค ํ˜ธ์ถœ๋งˆ๋‹ค ํ—ค๋”์— ๋ถ™์–ด์„œ ๊ฐ€์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ธธ์ด๊ฐ€ ๊ธธ๋‹ค๋Š” ๊ฒƒ์€ ๊ทธ๋งŒํผ ๋„คํŠธ์›Œํฌ ๋Œ€์—ญํญ ๋‚ญ๋น„๊ฐ€ ์‹ฌํ•˜๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

  • ํ•œ๋ฒˆ ๋ฐœ๊ธ‰๋œ ํ† ํฐ์€ ๊ฐ’์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ํ๊ธฐ๊ฐ€ ๋ถˆ๊ฐ€

JWT๋Š” ํ† ํฐ ๋‚ด์— ๋ชจ๋“  ์ •๋ณด๋ฅผ ๋‹ค ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ํ•œ๋ฒˆ ๋ฐœ๊ธ‰๋œ ํ† ํฐ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ์€ ์„œ๋ฒ„์—์„œ๋Š” ๋” ์ด์ƒ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ† ํฐ์„ ์ž˜๋ชป ๋ฐœํ–‰ํ•ด์„œ ์‚ญ์ œํ•˜๊ณ  ์‹ถ๋”๋ผ๋„, Signature๋งŒ ๋งž์œผ๋ฉด ๋งž๋Š” ํ† ํฐ์œผ๋กœ ์ธ์‹์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์„œ๋ฒ„์—์„œ๋Š” ํ•œ๋ฒˆ ๋ฐœ๊ธ‰๋œ ํ† ํฐ์˜ ์ •๋ณด๋ฅผ ๋ฐ”๊พธ๋Š” ์ผ๋“ฑ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋ž˜์„œ ๋งŒ์•ฝ์— JWT๋ฅผ ์“ด๋‹ค๋ฉด, Expire time์„ ๊ผญ ๋ช…์‹œ์ ์œผ๋กœ ๋‘๋„๋ก ํ•˜๊ณ , refresh token๋“ฑ์„ ์ด์šฉํ•ด์„œ, ์ค‘๊ฐ„์ค‘๊ฐ„ ํ† ํฐ์„ ์žฌ๋ฐœํ–‰ํ•˜๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

IAM ์„ค๊ณ„

FORCS IAM ์€ OAuth 2.0 ์˜ ์ธ์ฆํŒจํ„ด๊ณผ OpenSSO ์˜ URL Policy Driving ์˜ ํ˜ผํ•ฉ๋ฒ„์ „์ด๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹จ, OpenSSO URL Policy ์˜ ๊ฒฝ์šฐ ๊ฐœ๋…์„ ์ฐจ์šฉํ•ด ์ƒˆ๋กœ์šด ์„ค๊ณ„๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

IAM ํด๋ผ์ด์–ธํŠธ ๊ด€๋ฆฌ

IAM ํด๋ผ์ด์–ธํŠธ ๋งค๋‹ˆ์ง€๋จผํŠธ

IAM ์ธ์ฆ๊ณผ์ • ์‹œ๋‚˜๋ฆฌ์˜ค

Trust Client

์‚ฌ์šฉ์ž๊ฐ€ ์‹ ๋ขฐ์„ฑ ์žˆ๋Š” ์‚ฌ์ดํŠธ๋กœ ์ ‘๊ทผํ•  ๊ฒฝ์šฐ, ์ฆ‰ ์„œ๋น„์Šค ์ œ๊ณต์ž (E-form ์„œ๋น„์Šค) ์‚ฌ์ดํŠธ๋ฅผ ์ด์šฉํ•  ๊ฒฝ์šฐ์˜ ์ธ์ฆ ์‹œ๋‚˜๋ฆฌ์˜ค์ด๋‹ค.

3Th party Client

์‚ฌ์šฉ์ž๊ฐ€ ์™ธ๋ถ€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ†ตํ•ด ์„œ๋น„์Šค ์ œ๊ณต์ž์˜ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•  ๊ฒฝ์šฐ์˜ ์ธ์ฆ ์‹œ๋‚˜๋ฆฌ์˜ค์ด๋‹ค.

Resource Direct Access

๋ฆฌ์†Œ์Šค ์„œ๋ฒ„ ์ ‘๊ทผ ์‹œ๋‚˜๋ฆฌ์˜ค์ด๋‹ค. ์ด ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” E-form ์„œ๋น„์Šค์™€ ์—ฐ๊ณ„๋œ REST API ์„œ๋ฒ„์ธก์—์„œ ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„ ์ ‘๊ทผ์‹œ์—๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋œ๋‹ค.

Clone this wiki locally