OAuth
Last updated
Last updated
๋ค๋ฅธ ์น์ฌ์ดํธ์ ์ฌ์ฉ์ ์ ๋ณด(์์ด๋)๋ฅผ ์ด์ฉํ์ฌ ๋ค๋ฅธ ์น์ ์ ๊ทผ ๊ถํ์ ๋ถ์ฌํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๊ณต๊ฐ ํ์ค
์ด๋ค.
๊ธฐ์ ํ์ค ๋ฌธ์๊ฐ ๊ณต๊ฐ ๋์ด ์์ด ์ฌ์ฉ์ด ์์ ๋กญ๊ณ ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅธ ์ ์๊ฐ ์กด์ฌ ๊ฐ๋ฅํ๋ค.
์ธ์ฆ
์ด ์๋ ์ธ๊ฐ
ํ๋กํ ์ฝ
user : ๊ณ์ ์ ๊ฐ์ง๊ณ ์๋ ๊ฐ๊ฐ์ธ
consumer : OAuth๋ฅผ ์ด์ฉํ์ฌ service provider์ ์ ๊ทผํ๋ ์น์ฑ
service provider : OAuth์ ๊ทผ์ ์ง์ํ๋ ์น์ฑ
consumer secret : ์๋น์ค ์ ๊ณต์๊ฐ consumer๋ฅผ ๊ตฌ๋ถํ๊ณ ์ธ์ฆํ๊ธฐ ์ํ key
request token : consumer๊ฐ user์๊ฒ ์ ๊ทผ๊ถํ์ ์ธ์ฆ๋ฐ๊ธฐ ์ํ ์ ๋ณด๋ก access token์ผ๋ก ๋ณํ
access token : ์ธ์ฆ ํ์ consumer๊ฐ user ์ ๋ณด์ ์ ๊ทผํ๊ธฐ ์ํ key
์ฌ์ง ์ถ์ฒ : https://oauth.net/core/diagram.png
์๋น์๊ฐ ์๋น์ค ์ ๊ณต์์๊ฒ ์์ฒญ ํ ํฐ ์์ฒญ
์๋น์ค ์ ๊ณต์๊ฐ ์์ฒญํ ํฐ ๋ฐ๊ธ
์์ฒญํ ํฐ์ ๊ฐ์ง๊ณ ์ฌ์ฉ์๋ฅผ ์๋น์ค์ ๊ณต์๋ก ์ด๋ (Redirect)(์๋น์ค ์ ๊ณต์๊ฐ ์ฌ์ฉ์ ์ธ์ฆ ์ํ)
์๋น์ค ์ ๊ณต์๊ฐ ์ฌ์ฉ์๋ฅผ ์๋น์๋ก ์ด๋
์๋น์๊ฐ ์ ๊ทผ ํ ํฐ ์์ฒญ
์ธ์ฆ์ด ์๋ฃ ๋์๋ค๋ฉด ์๋น์ค์ ๊ณต์๊ฐ ์๋น์์๊ฒ ์ ๊ทผ ํ ํฐ ์ ๊ณต
์๋น์๋ ๋ฐ๊ธ๋ ์ ๊ทผ ํ ํฐ์ผ๋ก ์ฌ์ฉ์ ์ ๋ณด ์ ๊ทผ
๊ธฐ์กด์ OAuth1์ ์น์ฑ์ด ์๋ ์ฑ์์๋ ์ฌ์ฉํ๊ธฐ ๊ณค๋ํ๊ณ ์ ์ฐจ๊ฐ ๋ณต์กํด ๊ตฌํํ๊ธฐ๊ฐ ๊น๋ค๋กญ๊ณ ์ ์ฐจ๊ฐ ๋ณต์กํด Service Prvider์๊ฒ ๋ถ๋ด์ด ๋๋ค๋ ๋จ์ ์ ๊ฐ์ ํ์ฌ ๋์จ ๋ฒ์ ์ผ๋ก ๋ฒ์ 1๊ณผ ํธํ์ฑ์ด ์๋ค.
์น์ฑ์ด ์๋ ์ฑ ์ง์ ๊ฐํ
์ํธํ๊ฐ ํ์์๋ค (Https ์ฌ์ฉ)
Siganture๋จ์ํ ์ ๋ ฌ๊ณผ url์ธ์ฝ๋ฉ์ด ํ์์๋ค.
Authorization Code Grant Type : ๊ถํ ๋ถ์ฌ ์ฝ๋ ์น์ธ ํ์
ํด๋ผ์ด์ธํธ๊ฐ ๋ค๋ฅธ ์ฌ์ฉ์ ๋์ ํน์ ๋ฆฌ์์ค์ ์ ๊ทผ์ ์์ฒญํ ๋ ์ฌ์ฉ๋๋ค.
๋ฆฌ์ค์ ์ ๊ทผ์ ์ํ ์ฌ์ฉ์ ๋ช ๊ณผ ๋น๋ฐ๋ฒํธ, ๊ถํ ์๋ฒ์ ์์ฒญํด์ ๋ฐ์ ๊ถํ ์ฝ๋๋ฅผ ํจ๊ป ํ์ฉํ์ฌ ๋ฆฌ์์ค์ ๋ํ ์์ธ์ค ํ ํฐ์ ๋ฐ๋ ๋ฐฉ์์ ๋๋ค.
๊ณผ์
ํด๋ผ์ด์ธํธ๊ฐ ํ๋ผ๋ฏธํฐ๋ก ํด๋ผ์ด์ธํธ id
, ๋ฆฌ๋ค์ด๋ ํธ url
, ์๋ต ํ์
์ผ๋ก code, scope, state
์ง์ ํ์ฌ ๊ถํ ์๋ฒ์ ์ ๋ฌ (์ด๋ ์๋ตํ์
์ code,token์ด ๊ฐ๋ฅ)
๋ฆฌ๋ค์ด๋ ํธ ์ฌ์ดํธ์ ์ฌ์ฉ์์ ๋ก๊ทธ์ธ
๋ก๊ทธ์ธ ์ฑ๊ณต์ ๊ถํ ๋ถ์ฌ์ฝ๋๋ฅผ ๊ถํ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ผ๋ฉด ๊ทธ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ access token๊ถํ์ ๊ถํ ์๋ฒ์ ์ถ๊ฐ๋ก ์์ฒญ (client id, client_secret,redirect url, grant_type,code ํ๋ผ๋ฏธํฐ๋ก ์ ์ก)
๋ฐ์ access token์ ์ฌ์ฉํ์ฌ ๋ฆฌ์์ค ์๋ฒ์ ์ ๊ทผ
Implicit Grant Type : ์์์ ์น์ธ
๊ถํ ๋ถ์ฌ ์ฝ๋ ์น์ธ ํ์ ๊ณผ ๋ค๋ฅด๊ฒ ๊ถํ ์ฝ๋ ๊ตํ ๋จ๊ณ ์์ด ์์ธ์ค ํ ํฐ์ ์ฆ์ ๋ฐํ๋ฐ์ ์ด๋ฅผ ์ธ์ฆ์ ์ด์ฉํ๋ ๋ฐฉ์.
๊ณผ์
ํด๋ผ์ด์ธํธ๊ฐ ํ๋ผ๋ฏธํฐ๋ก ํด๋ผ์ด์ธํธ id
, ๋ฆฌ๋ค์ด๋ ํธ url
, ์๋ต ํ์
์ผ๋ก token, scope, state
์ง์ ํ์ฌ ์๋ฒ์ ์ ๋ฌ (์ด๋ ์๋ตํ์
์ code,token์ด ๊ฐ๋ฅ)
์ฌ์ฉ์์ ๋ก๊ทธ์ธ
๋ก๊ทธ์ธ ์ฑ๊ณตํ ๊ถํ ์๋ฒ๋ก๋ถํฐ Access Token์ ๋ฐ๊ณ ๋ค์ ๊ฒ์ฆ ์์ฒญ (url์ ?
์ ๊ฐ์ ์ฟผ๋ฆฌ๋ฌธ์ด ์๋#
๋ค์ ํ ํฐ ๊ฐ์ด ๋ฐํ๋จ์ผ๋ก์จ, ์๋ฒ๋ url์ ๊ฐ์ ์ ๊ทผํ ์ ์๋๋ก ๋ณด์ฅํ์ง๋ง ๋ธ๋ผ์ฐ์ ๋ http์์ฒญ์ access token์ ๋ค์ ์๋ฒ๋ก๋ ๋ณด๋ด์ง ์๊ณ accessToken์ ์๋ช
๋ ํ์ํจ์ผ๋ก์จ ๋งค์ฐ ์งง์ ์๊ฐ์ผ๋ก ์ค์ )
์์ฒญ ๋ฐ์ ๊ฒ์ฆ์ ๋ํ ์๋ต
Access Token์ ๊ฐ์ง๊ณ ๋ฆฌ์์ค ์๋ฒ์ ์ ๊ทผ
Access Token์ด ์์์ ํ๋์ด๊ธฐ ๋๋ฌธ์ /auth/token์ผ๋ก ์์ฒญ ๋ณด๋ผ ํผ๋ฃ๊ฐ ์๊ณ refresh token์ ๋ฐ๊ธํ์ง ์๋๋ค.
SPA์ ์ฑ์ด ์ค๊ฐ ์ฝ๋ ๊ตํ ๋จ๊ณ์์ด Access Token์ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ผ๋ก ์๋ JS ์ฑ์์ ์ฌ์ฉํ๊ธฐ ์ํด ๋ง๋ค์ด์ก๋ค.
Resource Owner Password Credentials Grant Type : ๋ฆฌ์์ค ์์ ์ ์ํธ ์๊ฒฉ ์ฆ๋ช ํ์
ํด๋ผ์ด์ธํธ๊ฐ ์ํธ๋ฅผ ์ฌ์ฉํ์ฌ ์์ธ์ค ํ ํฐ์ ๋ํ ์ฌ์ฉ์์ ์๊ฒฉ ์ฆ๋ช ์ ๊ตํํ๋ ๋์ ๋๋ค.
๊ณผ์
์ฌ์ฉ์๋ ํด๋ผ์ด์ธํธ์๊ฒ id,password๋ฅผ ํตํด ์๊ฒฉ ์ฆ๋ช
๋ฐ์ password๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ถํ ์๋ฒ์๊ฒ Access Token ์ ๋ณด ์์ฒญ
Access Token ์ ๋ณด๋ฅผ ๋ฐ๊ณ (Refresh Token๋ ๋ฐ์ ์ ์๋ค.) ์ด๋ฅผ ํตํด ๋ฆฌ์์ค ์๋ฒ ์ ๊ทผ
์ง์ ์ ์ธ password๋ฅผ ๊ฐ์ง๊ณ 1ํ๋ง์ ์ด๋ฃจ์ด์ง๋ ํ์ ์ผ๋ก ์๋ํํฐ๊ฐ ์๋ ์ฑ ์์ ์ ์ธ์ฆ์๋น์ค๋ฅผ ๊ตฌํํ ๋ ์ฌ์ฉ
์์ฒญ ๋งค๊ฐ๋ณ์
grant_type
username
password
client_id
client_secret
scope
Client Credentials Grant Type : ํด๋ผ์ด์ธํธ ์๊ฒฉ ์ฆ๋ช ํ์
ํด๋ผ์ด์ธํธ๊ฐ ์ปจํ ์คํธ ์ธ๋ถ์์ ์ก์ธ์ค ํ ํฐ์ ์ป์ด ํน์ ๋ฆฌ์์ค์ ์ ๊ทผ์ ์์ฒญํ ๋ ์ฌ์ฉํ๋ ๋ฐฉ์์ ๋๋ค.
๊ณผ์
์ฌ์ฉ์๋ ๊ถํ ์๋ฒ์๊ฒ ๋ฐ๋ก Access Token ์ ๋ณด ์์ฒญ (client_id, client_secret)
Access Token ์ ๋ณด ์๋ต
์ฌ์ฉ์๋ Access Token์ ๊ฐ์ง๊ณ resource ์๋ฒ ์ ๊ทผ
์ฌ์ฉ์๋ ์ด๋ค ๊ถํ ์ธ์ฆ์ ํ์ง ์๊ธฐ ๋๋ฌธ์ refresh token์ ๋๊ฒจ ์ฃผ์ง ์๊ณ client๊ฐ ๊ถํ ์์์ ๋ฐ์ ๋ฆฌ์์ค์ ์ง์ ์ ๊ทผ
๋ฐฑ์๋์์ ์คํ๋๋ CLI, ๋ฐ๋ชฌ ๊ฐ์ ์๋น์ค (M2M ์ฑ)์์๋ ์์คํ ์ด ์ฌ์ฉ์๊ฐ ์๋ ์ฑ์ ์ธ์ฆํ๊ณ ๊ถํ์ ๋ถ์ฌํ๋ ์๋๋ฆฌ์ค๋ก ์์ ๋ก๊ทธ์ธ๊ณผ ๊ฐ์ ์ผ๋ฐ์ ์ธ ์ธ์ฆ ์ฒด๊ณ๋ ์๋ฏธ ์๊ณ ์ด ๋ฐฉ์์ ์ฌ์ฉ
๋ค๋ฅธ ์ฌ์ดํธ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ ์ฌ์ฉํ๋ฉด ๊ฐ์ธ์ ๋ณด ์ ์ถ์ ๋ ๋ฌธ์ ๋๋ ๊ฒ์ด ์๋๋ํ๊ณ ๊ฑฑ์ ํ ์ ์์ผ๋ OAuth๋ฅผ ์ ๊ณตํ๋ ๊ธฐ์ ๋ค์ ๋๋ถ๋ถ ๊ฑฐ๋ํ ๊ธฐ์ ๋ค์ด๊ณ , ์์ ๊ธฐ์ ์์ ์ ๊ณตํ๋ ํ์๊ฐ์ ,๋ก๊ทธ์ธ๋ณด๋ค ์์ ํ ์ ์๋ค.
https://ko.wikipedia.org/wiki/OAuth
https://ko.wikipedia.org/wiki/%EA%B0%9C%EB%B0%A9%ED%98%95_%ED%91%9C%EC%A4%80
https://d2.naver.com/helloworld/24942
https://cheese10yun.github.io/spring-oauth2-provider/
https://developer.okta.com/blog/2018/06/29/what-is-the-oauth2-password-grant
์ฌ์ง์ถ์ฒ : https://auth0.com/docs/flows