-
Notifications
You must be signed in to change notification settings - Fork 1
forcs iam part 1
๊ธ๋ฒ FORCS ๊ณผ์ ์์ ํตํฉ์ธ์ฆ์ผํฐ(IAM)๊ฐ ์ฒ๋ฆฌํด์ผํ ์ฌํญ์, ํฌ๊ฒ ๋๊ฐ์ง๋ก ๋งฅ๋ฝ์ ์ก์ ์ ์๋ค.
- ํตํฉ์ธ์ฆ๊ธฐ๋ฅ
- ๋ฆฌ์์ค ์ ๊ทผ ์ ์ด
๊ฐ๊ฐ์ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ํ 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 ์๋๋ฆฌ์ค

๋ฆฌ์์ค ์ ๊ทผ ์ ์ด์ ๋ํด์๋, 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']
})
-
ํด๋น ์์์ ๋๋ฆฌ ์์ฒญํ๋ 3th party ํด๋ผ์ด์ธํธ๊ฐ ์ฌ์ฉ์์ ์ธ์ฆํ ํฐ๊ณผ ์ค์ฝํ๋ฅผ ๋ค๊ณ ์ธ์ฆ์๋ฒ์ ์์ฒญ์ ํ๋ค.
-
์ธ์ฆ์๋ฒ๋ ๋๊ฐ์ง ๊ถํ์ ์ฒดํฌํ๋ค.
-
3th party ํด๋ผ์ด์ธํธ๊ฐ ํด๋น ์ค์ฝํ์ ์ ๊ทผํ ๊ถํ์ด ์๋์ง? (์ค์ฝํ๊ฐ ๋ณ๋์ ๋น๋ง์ ํ์๋ก ํ๊ฑฐ๋ ํ๋ ๊ฒฝ์ฐ)
-
token ์ ์ฌ์ฉ์๊ฐ ํด๋น ์ค์ฝํ์ ์ ๊ทผํ ๊ถํ์ด ์๋์ง?
-
์ธ์ฆ์๋ฒ๋ ํด๋นํ๋ 3th party ๋ฅผ ํตํ ์ ์ด์์ฒญ์ ํํ์ฌ, ํด๋น ์ฌ์ฉ์์ ์์ ์ ๊ทผ ๊ถํ์ ์ ์ฅํ๋ค.
-
์ถํ 3th party ๋ฅผ ํตํ ์์ฒญ์ด ์ฌ ์์, 3th party ์ธก์์ ์ ๋ฌํ๋ ํ ํฐ์ ๋จ์ํ ClientKey ์ผ์๋ ์๊ณ , Jwt ํ ํฐ์ผ์๋ ์๋ค. ์ด๋ค ๊ฒฝ์ฐ์ด๋ ์ธ์ฆ์๋ฒ๋ ํ ํฐ์ผ๋ก๋ถํฐ ์ด๋ ํ 3th party ์ธ๊ฐ๋ฅผ ์์๋ด์ด ์๋ง์ ์์ ์ ๊ทผ์ ์๋ฝํ์ฌ์ผ ํ๋ค.
-
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๊ฐ ๊ธฐ์กด์ ๋ค๋ฅธ ์ธ์ฆ๊ณผ ๊ตฌ๋ถ๋๋ ํน์ง์ ํฌ๊ฒ ๋ ๊ฐ์ง์ด๋ค. ์ฒซ์งธ, API๋ฅผ ์ธ์ฆํจ์ ์์ด ์จ๋ํํฐ ์ดํ๋ฆฌ์ผ์ด์ ์๊ฒ ์ฌ์ฉ์์ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ ธ์ถํ์ง ์๊ณ ์ธ์ฆ ํ ์ ์๋ค๋ ์ . ๋์งธ, ์ธ์ฆ(authentication)๊ณผ API๊ถํ ๋ถ์ฌ(authorization )๋ฅผ ๋์์ ํ ์ ์๋ค๋ ์ ์ด๋ค. OAuth 1.0์ด ๋ง๋ค์ด์ง๋ ์์ ์๋ ์จ๋ํํฐ์๊ฒ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ ธ์ถํ์ง ์๊ณ ์ธ์ฆํ๋ ๋ฐฉ๋ฒ์ผ๋ก์ ์ด๋ฏธ Open ID๊ฐ ์์๋ค. ํ์ง๋ง Open ID๋ API์ ๊ถํ ๋ถ์ฌ๊ธฐ๋ฅ์ ๊ธฐ์ง๊ณ ์์ง ์์๊ณ ์ธ์ฆ ๋ฐฉ๋ฒ๋ OAuth์๋ ๋ฐฉํฅ์ด ๋ง์ด ๋ฌ๋๋ค.
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)์ ํฐ์ผ ๊ฐ๋ ๊ณผ ๋น์ทํ๋ค๋ผ๊ณ ํ ์ ์๋๋ฐ, ์๋์ ๊ฐ์ ํน์ง์ ๊ฐ์ง๋ค.
- ์ปจ์๋จธ๊ฐ ์์ด๋/ํจ์ค์๋๋ฅผ ๊ฐ์ง์ง ์๊ณ API๋ฅผ ์ฌ์ฉํ ์ ์์
- ํ์ํ API์๋ง ์ ํ์ ์ผ๋ก ์ ๊ทผํ ์ ์๋๋ก ๊ถํ ์ ์ด ๊ฐ๋ฅ
- ์ฌ์ฉ์๊ฐ ์๋น์ค ํ๋ก๋ฐ์ด๋์ ๊ด๋ฆฌ ํ์ด์ง์์ ๊ถํ ์ทจ์ ๊ฐ๋ฅ
- ํจ์ค์๋ ๋ณ๊ฒฝ ์์๋ ์ธ์ฆ ํ ํฐ์ ๊ณ์ ์ ํจํจ.
ํ์ฌ OAuth ๋ oauth-v2 ์ oauth-v2-bearer ๋ผ๋ 2๊ฐ์ ํ์ค์ด ๊ฐ์ฅ ํต์ฌ์ ์ธ ๋ถ๋ถ์ด๋ฉฐ ํ์ฌ RFC์ ๋ฑ๋ก๋๊ธฐ ์ํ ๊ณผ์ ์ ๋ฐ๊ณ ์๋ ์ค์ด๋ค. ๋๋ถ๋ถ โOAuth 2.0 ์ง์โ์ด๋ผ๊ณ ํ๋ ์๋น์ค ๋ค์ ์ด 2๊ฐ์ง spec์ ์ง์ํ ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค. ์ด ์ธ์๋ SAML, JSON ์น ํ ํฐ, MAC ํ ํฐ ๋ฑ์ ๋ฐฉ์์ด ์์ง๋ง ์์ง ํ๋ฐํ ์์ ์ค ์ด๊ธฐ ๋๋ฌธ์ ์ค์ ์๋น์ค์์ ์ฌ์ฉ๋๊ณ ์์ง๋ ์๋ค.
API ์๋น์ค๋ฅผ ์ผ์ฐ ์์ํ ํ์ฌ๋ค์ ๊ธฐ์กด์ OAuth 1.0a ๋ฅผ ๊ณ์ ์ ์งํ๋ ๊ฒฝ์ฐ๋ ๋ง์ด ์๋ค. 1.0a์ 2.0์ ์ฌ์ฉํ๋ ์๋ ค์ง ์๋น์ค ๋ค์ ์๋์ ๊ฐ๋ค.
์์์ 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์์๋ ๋ง์ด ์ฌ์ฉ๋์ง ์๋๋ค.
- Authorization Code Grant
์น ์๋ฒ์์ API๋ฅผ ํธ์ถํ๋ ๋ฑ์ ์๋๋ฆฌ์ค์์ Confidential Client๊ฐ ์ฌ์ฉํ๋ ๋ฐฉ์์ด๋ค. ์๋ฒ์ฌ์ด๋ ์ฝ๋๊ฐ ํ์ํ ์ธ์ฆ ๋ฐฉ์์ด๋ฉฐ ์ธ์ฆ ๊ณผ์ ์์ client_secret ์ด ํ์ํ๋ค. ๋ก๊ทธ์ธ์์ ํ์ด์ง URL์ response_type=code ๋ผ๊ณ ๋๊ธด๋ค.
- Implicit Grant
token๊ณผ scope์ ๋ํ ์คํ ๋ฑ์ ๋ค๋ฅด์ง๋ง OAuth 1.0a๊ณผ ๊ฐ์ฅ ๋น์ทํ ์ธ์ฆ๋ฐฉ์์ด๋ค. Public Client์ธ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ์ ์ดํ๋ฆฌ์ผ์ด์ (Javascript application)์ด๋ ๋ชจ๋ฐ์ผ ์ดํ๋ฆฌ์ผ์ด์ ์์ ์ด ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ๋๋ค. Client ์ฆ๋ช ์๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์์ผ๋ฉฐ ์ค์ ๋ก OAuth 2.0์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ๋ฐฉ์์ด๋ค. ๋ก๊ทธ์ธ์์ ํ์ด์ง URL์ response_type=token ๋ผ๊ณ ๋๊ธด๋ค.
- Password Credentials Grant
์ด ๋ฐฉ์์ 2-legged ๋ฐฉ์์ ์ธ์ฆ์ด๋ค. Client์ ์์ด๋/ํจ์ค์๋๋ฅผ ์ ์ฅํด ๋๊ณ ์์ด๋/ํจ์ค์๋๋ก ์ง์ access token์ ๋ฐ์์ค๋ ๋ฐฉ์์ด๋ค. Client ๋ฅผ ๋ฏฟ์ ์ ์์ ๋์๋ ์ฌ์ฉํ๊ธฐ์ ์ํํ๊ธฐ ๋๋ฌธ์ API ์๋น์ค์ ๊ณต์ ์ดํ๋ฆฌ์ผ์ด์ ์ด๋ ๋ฏฟ์ ์ ์๋ Client์ ํํด์๋ง ์ฌ์ฉํ๋ ๊ฒ์ ์ถ์ฒํ๋ค. ๋ก๊ทธ์ธ์์ API์ POST๋ก grant_type=password ๋ผ๊ณ ๋๊ธด๋ค.
- Client Credentials Grant
์ดํ๋ฆฌ์ผ์ด์ ์ด Confidential Client์ผ ๋ id์ secret์ ๊ฐ์ง๊ณ ์ธ์ฆํ๋ ๋ฐฉ์์ด๋ค. ๋ก๊ทธ์ธ์์ API์ POST๋ก grant_type=client_credentials ๋ผ๊ณ ๋๊ธด๋ค.
- Extension
OAuth 2.0์ ์ถ๊ฐ์ ์ธ ์ธ์ฆ๋ฐฉ์์ ์ ์ฉํ ์ ์๋ ๊ธธ์ ์ด์ด๋์๋ค. ์ด๋ฐ ๊ณผ๋ํ ํ์ฅ์ฑ์ ๋ฉ์ธ ์๋ํฐ์ธ Eran Hammer๋ ๋งค์ฐ ์ซ์ดํ๋ค๊ณ ํ๋ค.
Password Credentials Grant์ Client Credentials Grant๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฐ๋ฆฌ๊ฐ ์๊ฐํ๋ OAuth ์ ํ๋ก์ธ์ค๋ฅผ ๋ฐ๋ฅด์ง ์๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ ์ธ์ฆ๋ client์๋ง ์ฌ์ฉ๋์ด์ผ ํ๋ฉฐ ๊ฐ๋ฅํ๋ฉด ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข๋ค.
OAuth 2.0์ ๊ธฐ๋ณธ์ ์ผ๋ก Bearer ํ ํฐ, ์ฆ ์ํธํํ์ง ์์ ๊ทธ๋ฅ ํ ํฐ์ ์ฃผ๊ณ ๋ฐ๋ ๊ฒ์ผ๋ก ์ธ์ฆ์ ํ๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก HTTPS ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ํ ํฐ์ ์์ ํ๊ฒ ์ฃผ๊ณ ๋ฐ๋ ๊ฒ์ HTTPS์ ์ํธํ์ ์์กดํ๋ค. ๋ํ ๋ณต์กํ signature ๋ฑ์ ์์ฑํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ curl์ด API๋ฅผ ํธ์ถ ํ ๋ ๊ฐ๋จํ๊ฒ Header ์ ์๋์ ๊ฐ์ด ํ ์ค์ ๊ฐ์ด ๋ณด๋ด๋ฏ๋ก์ API๋ฅผ ํ ์คํธํด๋ณผ ์ ์๋ค.
Authorization: Bearer
๋ํ OAuth 2.0์ MAC ํ ํฐ๊ณผ SAML ํ์์ ํ ํฐ์ ์ง์ํ ์ ์์ง๋ง ํ์ฌ MAC ํ ํฐ ์คํ์ ์ ๋ฐ์ดํธ ๋์ง ์์ ๊ธฐํ ๋ง๋ฃ๋ ์ํ์ด๊ณ SAML ํ ํฐ ํ์๋ ์์ง์ ํ๋ฐํ๊ฒ ์์ ์ค์ด๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ ์ ์๋ ์ํ์ด๋ค. ์ ๋ฆฌํ์๋ฉด, OAuth 2.0์ ๋ค์ํ ํ ํฐ ํ์ ์ ์ง์ํ์ง๋ง ์ค์ง์ ์ผ๋ก๋ Bearer ํ ํฐ ํ์ ๋ง ์ง์ํ๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ์ access token์ ์ค๋ ์ฌ์ฉํ๋ฉด ๊ฒฐ๊ตญ์ ํดํน์ ๋ ธ์ถ๋ ์ํ์ด ๋์์ง๋ค. ๊ทธ๋์ OAuth 2.0์์๋ refresh token ์ด๋ผ๋ ๊ฐ๋ ์ ๋์ ํ๋ค. ์ฆ, ์ธ์ฆ ํ ํฐ(access token)์ ๋ง๋ฃ๊ธฐ๊ฐ์ ๊ฐ๋ฅํ ์งง๊ฒ ํ๊ณ ๋ง๋ฃ๊ฐ ๋๋ฉด refresh token์ผ๋ก access token์ ์๋ก ๊ฐฑ์ ํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ด ๋ฐฉ๋ฒ์ ๊ฐ๋ฐ์๋ค ์ฌ์ด์์๋ ๋ ผ๋์ด ์๋๋ฐ, ํ ํฐ์ ์ํ๋ฅผ ๊ด๋ฆฌํด์ผ ํด์ ๊ฐ๋ฐ์ด ๋ณต์กํด ์ง ๋ฟ๋ง ์๋๋ผ ํ ํฐ์ด ๋ง๋ฃ๋๋ฉด ๋ค์ ๋ก๊ทธ์ธ ํ๋๋ก ํ๋ ๊ฒ์ด ๋ณด์ ๋ฉด์์๋ ์์ ํ๋ค๋ ์๊ฒฌ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
OAuth 2.0์ ์จ๋ํํฐ ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ถํ์ ์ค์ ํ๊ธฐ ์ํ ๊ธฐ๋ฅ์ด๋ค. scope์ ์ด๋ฆ์ด ์คํ์ ์ ์๋์ด์์ง๋ ์์ผ๋ฉฐ ์ฌ๋ฌ ๊ฐ์ ๊ถํ์ ์์ฒญํ ๋์๋ ์ฝค๋ง๋ฑ์ ์ฌ์ฉํด์ ๋ก๊ทธ์ธ ์์ scope๋ฅผ ๋๊ฒจ์ฃผ๊ฒ ๋๋ค. http://example.com/oauth?โฆ.&scope=read_article,update_profile
๋ค์์ ์ค๊ณ์ ์์ด ๋ํ๋์ ๊ณ ๋ ค ๋ฐฉ์์ธ OpenSSO ๋ฅผ ์ดํด๋ณด๋๋ก ํ๋ค.


-
Rules
-
Subjects
-
Conditions
-
Response Providers
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) 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) 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 ๋ฅผ ์ดํด๋ณด๋๋ก ํ๋ค.
์ถ์ฒ : http://bcho.tistory.com/999
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 ๊ธฐ๋ฐ์ ํ ํฐ์ด ์ด๋ค ์ฐจ์ด๋ฅผ ๊ฐ์ง ์ ์๋ ์ง ์์๋ณด๋๋ก ํ์.

- API ํด๋ผ์ด์ธํธ๊ฐ Authorization Server (ํ ํฐ ๋ฐ๊ธ์๋ฒ)๋ก ํ ํฐ์ ์์ฒญํ๋ค. ์ด๋, ํ ํฐ ๋ฐ๊ธ์ ์์ฒญํ๋ ์ฌ์ฉ์์ ๊ณ์ ๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ๋๊ธฐ๊ณ , ์ด์ ํจ๊ป ํ ํฐ์ ๊ถํ(์ฉ๋)์ ์์ฒญํ๋ค. ์ฌ๊ธฐ์๋ ์ผ๋ฐ ์ฌ์ฉ์ ๊ถํ(enduser)๊ณผ ๊ด๋ฆฌ์ ๊ถํ(admin)์ ๊ฐ์ด ์์ฒญํ์๋ค.
- ํ ํฐ ์์ฑ ์์ฒญ์ ๋ฐ์ Authorization Server๋ ์ฌ์ฉ์ ๊ณ์ ์ ํ์ธํ ํ, ์ด ์ฌ์ฉ์์๊ฒ ์์ฒญ๋ ๊ถํ์ ๋ถ์ฌํด๋ ๋๋์ง ๊ณ์ ์์คํ ๋ฑ์ ๋ฌผ์ด๋ณธ ํ, ์ฌ์ฉ์์๊ฒ ํด๋น ํ ํฐ์ ๋ฐ๊ธ์ด ๊ฐ๋ฅํ๋ฉด ํ ํฐ์ ๋ฐ๊ธํ๊ณ , ํ ํฐ์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๋ถ(ํ ํฐ ์ ์ฅ์)์ ์ ์ฅํด๋๋๋ค.
- ์ด๋ ๊ฒ ์์ฑ๋ ํ ํฐ์ API ํด๋ผ์ด์ธํธ๋ก ์ ์ฅ๋๋ค.
- API ํด๋ผ์ด์ธํธ๋ API๋ฅผ ํธ์ถํ ๋ ์ด ํ ํฐ์ ์ด์ฉํด์ Resource Server(API ์๋ฒ)์ ์๋ API๋ฅผ ํธ์ถํ๋ค.
- ์ด๋ ํธ์ถ๋๋ API๋ ๊ด๋ฆฌ์ ๊ถํ์ ๊ฐ์ง๊ณ ์์ด์ผ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์, Resource Server๊ฐ ํ ํฐ ์ ์ฅ์์์ ํ ํฐ์ ๊ด๋ จ๋ ์ฌ์ฉ์ ๊ณ์ , ๊ถํ ๋ฑ์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์จ๋ค. ์ด ํ ํฐ์ (๊ด๋ฆฌ์)admin ๊ถํ์ด ๋ถ์ฌ๋์ด ์๊ธฐ ๋๋ฌธ์, API ํธ์ถ์ ํ์ฉํ๋ค. ์์ ์ ์ํ ์๋๋ฆฌ์ค์์๋ ๊ทธ ์ฌ์ฉ์๊ฐ ์ํ โํ์ฌโ์ ์ฌ์ฉ์ ์ ๋ณด๋ง ์กฐํํ ์ ์๋ค. ๋ผ๋ ์ ์ ์กฐ๊ฑด์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์, API ์๋ฒ๋ ์ถ๊ฐ๋ก ์ฌ์ฉ์ ๋ฐ์ดํ ๋ฒ ์ด์ค์์ ์ด ์ฌ์ฉ์๊ฐ ์ํ โํ์ฌโ ์ ๋ณด๋ฅผ ์ฐพ์์์ผํ๋ค.
- API์๋ฒ๋ ์๋ต์ ๋ณด๋ธ๋ค.

- ํ ํฐ์ ์์ฑ ์์ฒญํ๋ ๋ฐฉ์์ ๋์ผํ๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ์ฌ์ฉ์๋ฅผ ์ธ์ฆํ๋ค์์, ํ ํฐ์ ์์ฑํ๋ค.
- ๋ค๋ฅธ ์ ์ ์์ฑ๋ ํ ํฐ์ ๊ด๋ จ๋ ์ ๋ณด๋ฅผ ๋ณ๋๋ก ์ ์ฅํ์ง ์๋๋ค๋ ๊ฒ์ด๋ค. ํ ํฐ์ ์ฐ๊ด๋๋ ์ฌ์ฉ์ ์ ๋ณด๋ ๊ถํ๋ฑ์ ํ ํฐ ์์ฒด์ ๋ฃ์ด์ ์ ์ฅํ๋ค.
- API๋ฅผ ํธ์ถํ๋ ๋ฐฉ์๋ ๋์ผํ๋ค.
- Resource Server (API ์๋ฒ)๋ ํ ํฐ ๋ด์ ๋ค์ด ์๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ๊ถํ ์ธ๊ฐ ์ฒ๋ฆฌ๋ฅผ ํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํ๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์ฐจ์ด์ ์ ํ ํฐ์ ์์ฑํ๋ ๋จ๊ณ์์๋ ์์ฑ๋ ํ ํฐ์ ๋ณ๋๋ก ์๋ฒ์์ ์ ์งํ ํ์๊ฐ ์์ผ๋ฉฐ ํ ํฐ์ ์ฌ์ฉํ๋ API ์๋ฒ ์ ์ฅ์์๋ API ์์ฒญ์ ๊ฒ์ฆํ๊ธฐ ์ํด์ ํ ํฐ์ ๊ฐ์ง๊ณ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ณ๋๋ก ๊ณ์ ์์คํ ๋ฑ์์ ์กฐํํ ํ์๊ฐ ์๋ค๋ ๊ฒ์ด๋ค.
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๋ฑ์ ์ด์ฉํด์, ์ค๊ฐ์ค๊ฐ ํ ํฐ์ ์ฌ๋ฐํํ๋๋ก ํด์ผ ํ๋ค.
FORCS IAM ์ OAuth 2.0 ์ ์ธ์ฆํจํด๊ณผ OpenSSO ์ URL Policy Driving ์ ํผํฉ๋ฒ์ ์ด๋ผ ํ ์ ์๋ค.
๋จ, OpenSSO URL Policy ์ ๊ฒฝ์ฐ ๊ฐ๋ ์ ์ฐจ์ฉํด ์๋ก์ด ์ค๊ณ๊ฐ ํ์ํ๋ค.



์ฌ์ฉ์๊ฐ ์ ๋ขฐ์ฑ ์๋ ์ฌ์ดํธ๋ก ์ ๊ทผํ ๊ฒฝ์ฐ, ์ฆ ์๋น์ค ์ ๊ณต์ (E-form ์๋น์ค) ์ฌ์ดํธ๋ฅผ ์ด์ฉํ ๊ฒฝ์ฐ์ ์ธ์ฆ ์๋๋ฆฌ์ค์ด๋ค.

์ฌ์ฉ์๊ฐ ์ธ๋ถ ์ดํ๋ฆฌ์ผ์ด์ ์ ํตํด ์๋น์ค ์ ๊ณต์์ ์๋น์ค๋ฅผ ์ด์ฉํ ๊ฒฝ์ฐ์ ์ธ์ฆ ์๋๋ฆฌ์ค์ด๋ค.

๋ฆฌ์์ค ์๋ฒ ์ ๊ทผ ์๋๋ฆฌ์ค์ด๋ค. ์ด ์๋๋ฆฌ์ค๋ E-form ์๋น์ค์ ์ฐ๊ณ๋ REST API ์๋ฒ์ธก์์ ๋ฆฌ์์ค ์๋ฒ ์ ๊ทผ์์๋ ๋์ผํ๊ฒ ์ ์ฉ๋๋ค.



