OAuth 2.0์ ๊ถํ ๋ถ์ฌ ๋ฐฉ์(Grant Types): ์ํฉ์ ๋ง๋ ์ธ์ฆ ๋ฐฉ๋ฒ ์ ํํ๊ธฐ
OAuth 2.0์ ๊ถํ ๋ถ์ฌ ๋ฐฉ์์ด๋?
OAuth 2.0์ ๋ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ํ๊ฒฝ์ ๋ง๋ ์ธ์ฆ ๋ฐฉ์์ ์ ๊ณต ํฉ๋๋ค. ๊ถํ ๋ถ์ฌ ๋ฐฉ์(Grant Type)์ ์ฌ์ฉ์๊ฐ ์๋น์ค์ ์ด๋ป๊ฒ ๊ถํ์ ๋ถ์ฌ ํ ์ง ๊ฒฐ์ ํ๋ ๋ฐฉ์์ ๋๋ค. OAuth 2.0์ ๋ค ๊ฐ์ง ์ฃผ์ ๊ถํ ๋ถ์ฌ ๋ฐฉ์์ ์ ๊ณตํฉ๋๋ค: Authorization Code Grant , Implicit Grant , Resource Owner Password Credentials Grant , Client Credentials Grant .
1. ๊ถํ ๋ถ์ฌ ๋ฐฉ์(Grant Types) ๋น๊ต
๊ถํ ๋ถ์ฌ ๋ฐฉ์ | ์ค๋ช | ์ฌ์ฉ ์์ |
---|---|---|
Authorization Code Grant | ํด๋ผ์ด์ธํธ๊ฐ ์ฝ๋ ๋ฅผ ํตํด ํ ํฐ ๋ฐ๊ธ | ์น ์ ํ๋ฆฌ์ผ์ด์ ์ธ์ฆ |
Implicit Grant | ๋ธ๋ผ์ฐ์ ์์ ์ง์ Access Token ๋ฐ๊ธ | SPA ์ ๊ฐ์ ํด๋ผ์ด์ธํธ ์ธก ์ ํ๋ฆฌ์ผ์ด์ |
Resource Owner Password Credentials | ์ฌ์ฉ์๊ฐ ์ง์ ์์ด๋์ ๋น๋ฐ๋ฒํธ ์ ๊ณต | ์ ๋ขฐํ ์ ์๋ ๋ด๋ถ ์ ํ๋ฆฌ์ผ์ด์ |
Client Credentials Grant | ํด๋ผ์ด์ธํธ ์๊ฒฉ ์ฆ๋ช ์ผ๋ก ํ ํฐ ๋ฐ๊ธ | ์๋ฒ ๊ฐ API ํต์ |
2. Authorization Code Grant: ๊ฐ์ฅ ์์ ํ ๋ฐฉ์
Authorization Code Grant ๋ ์ฌ์ฉ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ฌ์ด์ ๊ถํ ๋ถ์ฌ ์ฝ๋(Authorization Code) ๋ฅผ ์ฌ์ฉํด ์ธ์ฆ์ ์ํํฉ๋๋ค. ์ฃผ๋ก ์๋ฒ ๊ธฐ๋ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ๋ฉ๋๋ค.
์ธ์ฆ ํ๋ฆ
- ์ฌ์ฉ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ก๊ทธ์ธ ์์ฒญ์ ํฉ๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ Authorization Server(๊ถํ ๋ถ์ฌ ์๋ฒ) ๋ก ๋ฆฌ๋๋ ์ ํฉ๋๋ค.
- ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ๊ณ ๊ถํ ๋ถ์ฌ ์ฝ๋ ๋ฅผ ์ ๋ฌ๋ฐ์ต๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝ๋๋ฅผ ์ฌ์ฉํด Access Token ์ ์์ฒญํฉ๋๋ค.
์ฝ๋ ์์ : Flask๋ฅผ ์ฌ์ฉํ Authorization Code Grant
import requests
from flask import Flask, redirect, request, session
app = Flask(__name__)
app.secret_key = 'your_secret_key'
CLIENT_ID = 'your_client_id'
CLIENT_SECRET = 'your_client_secret'
REDIRECT_URI = 'http://localhost:5000/callback'
TOKEN_URL = 'https://accounts.google.com/o/oauth2/token'
@app.route('/')
def home():
return '<a href="/login">๊ตฌ๊ธ ๋ก๊ทธ์ธ</a>'
@app.route('/login')
def login():
auth_url = f"https://accounts.google.com/o/oauth2/auth?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope=email"
return redirect(auth_url)
@app.route('/callback')
def callback():
code = request.args.get('code')
response = requests.post(TOKEN_URL, data={
'code': code,
'client_id': CLIENT_ID,
'client_secret': CLIENT_SECRET,
'redirect_uri': REDIRECT_URI,
'grant_type': 'authorization_code'
}).json()
session['access_token'] = response['access_token']
return '๋ก๊ทธ์ธ ์ฑ๊ณต!'
if __name__ == '__main__':
app.run(debug=True)
OAuth 2.0์ ๊ถํ ๋ถ์ฌ ๋ฐฉ์์ด๋?
OAuth 2.0์ ๋ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ํ๊ฒฝ์ ๋ง๋ ์ธ์ฆ ๋ฐฉ์์ ์ ๊ณต ํฉ๋๋ค. ๊ถํ ๋ถ์ฌ ๋ฐฉ์(Grant Type)์ ์ฌ์ฉ์๊ฐ ์๋น์ค์ ์ด๋ป๊ฒ ๊ถํ์ ๋ถ์ฌ ํ ์ง ๊ฒฐ์ ํ๋ ๋ฐฉ์์ ๋๋ค. OAuth 2.0์ ๋ค ๊ฐ์ง ์ฃผ์ ๊ถํ ๋ถ์ฌ ๋ฐฉ์์ ์ ๊ณตํฉ๋๋ค: Authorization Code Grant , Implicit Grant , Resource Owner Password Credentials Grant , Client Credentials Grant .
1. ๊ถํ ๋ถ์ฌ ๋ฐฉ์(Grant Types) ๋น๊ต
๊ถํ ๋ถ์ฌ ๋ฐฉ์ | ์ค๋ช | ์ฌ์ฉ ์์ |
---|---|---|
Authorization Code Grant | ํด๋ผ์ด์ธํธ๊ฐ ์ฝ๋ ๋ฅผ ํตํด ํ ํฐ ๋ฐ๊ธ | ์น ์ ํ๋ฆฌ์ผ์ด์ ์ธ์ฆ |
Implicit Grant | ๋ธ๋ผ์ฐ์ ์์ ์ง์ Access Token ๋ฐ๊ธ | SPA ์ ๊ฐ์ ํด๋ผ์ด์ธํธ ์ธก ์ ํ๋ฆฌ์ผ์ด์ |
Resource Owner Password Credentials | ์ฌ์ฉ์๊ฐ ์ง์ ์์ด๋์ ๋น๋ฐ๋ฒํธ ์ ๊ณต | ์ ๋ขฐํ ์ ์๋ ๋ด๋ถ ์ ํ๋ฆฌ์ผ์ด์ |
Client Credentials Grant | ํด๋ผ์ด์ธํธ ์๊ฒฉ ์ฆ๋ช ์ผ๋ก ํ ํฐ ๋ฐ๊ธ | ์๋ฒ ๊ฐ API ํต์ |
2. Authorization Code Grant: ๊ฐ์ฅ ์์ ํ ๋ฐฉ์
Authorization Code Grant ๋ ์ฌ์ฉ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ฌ์ด์ ๊ถํ ๋ถ์ฌ ์ฝ๋(Authorization Code) ๋ฅผ ์ฌ์ฉํด ์ธ์ฆ์ ์ํํฉ๋๋ค. ์ฃผ๋ก ์๋ฒ ๊ธฐ๋ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ๋ฉ๋๋ค.
์ธ์ฆ ํ๋ฆ
- ์ฌ์ฉ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ก๊ทธ์ธ ์์ฒญ์ ํฉ๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ Authorization Server(๊ถํ ๋ถ์ฌ ์๋ฒ) ๋ก ๋ฆฌ๋๋ ์ ํฉ๋๋ค.
- ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ๊ณ ๊ถํ ๋ถ์ฌ ์ฝ๋ ๋ฅผ ์ ๋ฌ๋ฐ์ต๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝ๋๋ฅผ ์ฌ์ฉํด Access Token ์ ์์ฒญํฉ๋๋ค.
์ฝ๋ ์์ : Flask๋ฅผ ์ฌ์ฉํ Authorization Code Grant
import requests
from flask import Flask, redirect, request, session
app = Flask(__name__)
app.secret_key = 'your_secret_key'
CLIENT_ID = 'your_client_id'
CLIENT_SECRET = 'your_client_secret'
REDIRECT_URI = 'http://localhost:5000/callback'
TOKEN_URL = 'https://accounts.google.com/o/oauth2/token'
@app.route('/')
def home():
return '<a href="/login">๊ตฌ๊ธ ๋ก๊ทธ์ธ</a>'
@app.route('/login')
def login():
auth_url = f"https://accounts.google.com/o/oauth2/auth?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope=email"
return redirect(auth_url)
@app.route('/callback')
def callback():
code = request.args.get('code')
response = requests.post(TOKEN_URL, data={
'code': code,
'client_id': CLIENT_ID,
'client_secret': CLIENT_SECRET,
'redirect_uri': REDIRECT_URI,
'grant_type': 'authorization_code'
}).json()
session['access_token'] = response['access_token']
return '๋ก๊ทธ์ธ ์ฑ๊ณต!'
if __name__ == '__main__':
app.run(debug=True)
์ค๋ช : ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ๋ฉด ๊ถํ ๋ถ์ฌ ์ฝ๋ ๋ฅผ ํตํด Access Token์ ๋ฐ๊ธ๋ฐ์ API ํธ์ถ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
3. Implicit Grant: ํด๋ผ์ด์ธํธ ์ธก ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉ
Implicit Grant ๋ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ๋ฐฉ์์ Access Token์ ์ง์ ๋ฐ๊ธ ํ๋ฉฐ, ๋ณด์ ์ด์๋ก ์ธํด OAuth 2.1์์ ์ ๊ฑฐ๋์์ต๋๋ค.
ํน์ง
- Access Token์ด ํด๋ผ์ด์ธํธ ์ธก ์์ ์ง์ ๋ฐ๊ธ๋ฉ๋๋ค.
- ํ ํฐ์ ์์ ํ๊ฒ ๊ด๋ฆฌํ๊ธฐ ์ด๋ ค์ ๋ณด์์ด ์ทจ์ฝํ ์ ์์ต๋๋ค.
- SPA(Single Page Application) ์์ ์ฌ์ฉ๋์์ต๋๋ค.
4. Resource Owner Password Credentials Grant: ๋น๋ฐ๋ฒํธ ์ง์ ์ ๊ณต
Resource Owner Password Credentials Grant ๋ ์ฌ์ฉ์๊ฐ ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ง์ ์ ๊ณต ํด ํ ํฐ์ ๋ฐ๊ธ๋ฐ๋ ๋ฐฉ์์ ๋๋ค. ์ ๋ขฐํ ์ ์๋ ๋ด๋ถ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ง ์ฌ์ฉํด์ผ ํฉ๋๋ค.
ํน์ง
- ์ฌ์ฉ์๊ฐ ์๊ฒฉ ์ฆ๋ช ์ ์ง์ ์ ๊ณตํด์ผ ํ๋ฏ๋ก ๋ณด์ ์ํ ์ด ํฝ๋๋ค.
- OAuth 2.1 ์์๋ ๊ถ์ฅ๋์ง ์๋ ๋ฐฉ์์ ๋๋ค.
5. Client Credentials Grant: ์๋ฒ ๊ฐ ํต์ ์ ์ฌ์ฉ
Client Credentials Grant ๋ ํด๋ผ์ด์ธํธ ์๊ฒฉ ์ฆ๋ช ์ผ๋ก Access Token์ ๋ฐ๊ธ๋ฐ์ต๋๋ค. ์ฃผ๋ก ์๋ฒ ๊ฐ API ํต์ ์ ์ฌ์ฉ๋ฉ๋๋ค.
์ธ์ฆ ํ๋ฆ
- ํด๋ผ์ด์ธํธ๊ฐ ํด๋ผ์ด์ธํธ ์์ด๋์ ๋น๋ฐ๋ฒํธ ๋ฅผ ์ฌ์ฉํด Access Token์ ์์ฒญํฉ๋๋ค.
- ๊ถํ ๋ถ์ฌ ์๋ฒ๊ฐ Access Token์ ๋ฐ๊ธํฉ๋๋ค.
์ฝ๋ ์์ : Client Credentials Grant ๊ตฌํ
import requests
CLIENT_ID = 'your_client_id'
CLIENT_SECRET = 'your_client_secret'
TOKEN_URL = 'https://example.com/oauth/token'
response = requests.post(TOKEN_URL, data={
'grant_type': 'client_credentials',
'client_id': CLIENT_ID,
'client_secret': CLIENT_SECRET
})
access_token = response.json().get('access_token')
print(f"Access Token: {access_token}")
์ค๋ช : ์ด ์์ ์์๋ ์๋ฒ ๊ฐ ํต์ ์์ ํด๋ผ์ด์ธํธ ์๊ฒฉ ์ฆ๋ช ์ ์ฌ์ฉํด Access Token์ ๋ฐ๊ธ๋ฐ๋ ๊ณผ์ ์ ๋ณด์ฌ์ค๋๋ค.
OAuth 2.0 ๊ถํ ๋ถ์ฌ ๋ฐฉ์ ์ ํ ๊ฐ์ด๋
์ ํ๋ฆฌ์ผ์ด์ ์ ํ | ๊ถ์ฅ๋๋ ๊ถํ ๋ถ์ฌ ๋ฐฉ์ |
---|---|
์๋ฒ ๊ธฐ๋ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ | Authorization Code Grant |
๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ SPA | Implicit Grant (OAuth 2.1์์๋ ๊ถ์ฅ๋์ง ์์) |
๋ด๋ถ ์ ํ๋ฆฌ์ผ์ด์ | Resource Owner Password Credentials Grant |
์๋ฒ ๊ฐ ํต์ | Client Credentials Grant |
์ต์ OAuth ํธ๋ ๋์ ๊ถ์ฅ ์ฌํญ
- OAuth 2.1 ์์๋ Implicit Grant ๋ฐฉ์ ์ ๊ฑฐ ์ PKCE ํ์ํ ๊ฐ ์ด๋ฃจ์ด์ก์ต๋๋ค.
- ๋ชจ๋ฐ์ผ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ Authorization Code Grant + PKCE ์กฐํฉ์ด ํ์๋ก ์ฌ์ฉ๋ฉ๋๋ค.
- ์๋ฒ ๊ฐ ํต์ ์์๋ ์ฌ์ ํ Client Credentials Grant ๊ฐ ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค.
FAQ
Q1. OAuth 2.0์์ ๊ฐ์ฅ ์์ ํ ๊ถํ ๋ถ์ฌ ๋ฐฉ์์ ๋ฌด์์ธ๊ฐ์?
A1. Authorization Code Grant ๊ฐ ๊ฐ์ฅ ์์ ํ๋ฉฐ, ํนํ PKCE ์ ํจ๊ป ์ฌ์ฉํ๋ฉด ๋ณด์์ด ๊ฐํ๋ฉ๋๋ค.
Q2. OAuth 2.1์์ Implicit Grant๊ฐ ์ ๊ฑฐ๋ ์ด์ ๋ ๋ฌด์์ธ๊ฐ์?
A2. Implicit Grant๋ ํ ํฐ ๊ด๋ฆฌ๊ฐ ์ด๋ ค์ ๋ณด์ ์ด์๊ฐ ๋ง์๊ธฐ ๋๋ฌธ์ ์ ๊ฑฐ๋์์ต๋๋ค.
Q3. Client Credentials Grant๋ ์ธ์ ์ฌ์ฉํ๋์?
A3. ์๋ฒ ๊ฐ ํต์ ์ด๋ ๋ฐฑ์๋ ์๋น์ค ๊ฐ API ํธ์ถ ์ ์ฌ์ฉ๋ฉ๋๋ค.
Q4. Resource Owner Password Credentials Grant๋ ์ ๊ถ์ฅ๋์ง ์๋์?
A4. ์ฌ์ฉ์๊ฐ ๋น๋ฐ๋ฒํธ๋ฅผ ์ง์ ์ ๊ณต ํด์ผ ํ๋ฏ๋ก, ๋ณด์ ์ํ์ด ํฌ๊ธฐ ๋๋ฌธ์
๋๋ค.
Q5. Authorization Code Grant์ PKCE๋ ์ธ์ ์ฌ์ฉํด์ผ ํ๋์?
A5. ๋ชจ๋ฐ์ผ ์ฑ๊ณผ ๊ฐ์ ๊ณต๊ฐ ํด๋ผ์ด์ธํธ ์์๋ ๋ฐ๋์ PKCE ์ ํจ๊ป ์ฌ์ฉํด์ผ ํฉ๋๋ค.
'IT' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
OAuth 2.0์ ํต์ฌ ์์์ ํ ํฐ ๊ด๋ฆฌ: ํจ์จ์ ์ธ ์ธ์ฆ ์์คํ ๊ตฌ์ถํ๊ธฐ (0) | 2024.10.18 |
---|---|
OAuth 2.0์ ๊ถํ ๋ถ์ฌ ๋ฐฉ์ ์ ํ ์ ๊ณ ๋ คํ ์ (0) | 2024.10.18 |
OAuth 2.0๊ณผ OAuth 2.1์ ๋์ ์ฌ๋ก (0) | 2024.10.18 |
OAuth 1.0๊ณผ OAuth 2.0์ ๋น๊ต: ํ๋กํ ์ฝ ๋ณํ์ ๋ณด์์ฑ์ ์งํ (0) | 2024.10.18 |
OAuth์ ์ฅ์ ๊ณผ ํ๊ณ (0) | 2024.10.18 |
๋๊ธ