OAuth 2.0์ ํ์ฉํ ์์ ๋ก๊ทธ์ธ ๊ตฌํ: ๊ตฌ๊ธ, ํ์ด์ค๋ถ, ์นด์นด์ค ์ฐ๋ ๊ฐ์ด๋
์์ ๋ก๊ทธ์ธ์ ํ์์ฑ๊ณผ OAuth 2.0์ ์ญํ
์์ ๋ก๊ทธ์ธ์ ์ฌ์ฉ์๊ฐ ๋ณ๋์ ๊ณ์ ์ ๋ง๋ค ํ์ ์์ด ๊ธฐ์กด ์์ ๊ณ์ ์ ์ฌ์ฉํด ์๋น์ค์ ๋ก๊ทธ์ธํ ์ ์๊ฒ ๋์์ค๋๋ค. OAuth 2.0 ์ ์ด๋ฌํ ์์ ๋ก๊ทธ์ธ์์ ์์ ํ ์ธ์ฆ๊ณผ ๊ถํ ๋ถ์ฌ ๋ฅผ ๋ด๋นํ๋ ํต์ฌ ํ๋กํ ์ฝ์ ๋๋ค. ๊ตฌ๊ธ, ํ์ด์ค๋ถ, ์นด์นด์ค์ ๊ฐ์ ์ ๊ณต์๊ฐ OAuth ํ์ค ์ ์ฌ์ฉํด API๋ฅผ ์ ๊ณตํฉ๋๋ค.
1. ์์ ๋ก๊ทธ์ธ ๊ตฌํ ํ๋ฆ
- ์ฌ์ฉ์ ๋ก๊ทธ์ธ ์์ฒญ : ์ฌ์ฉ์๊ฐ ์์ ๋ก๊ทธ์ธ ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
- OAuth ์ ๊ณต์์ ์ธ์ฆ ์ฐ๋ : ์ฌ์ฉ์๋ ์์ ์๋น์ค์ ์ธ์ฆํ๊ณ ๊ถํ์ ๋ถ์ฌ ํฉ๋๋ค.
- Access Token ๋ฐ๊ธ : ์ ๊ณต์๋ Access Token์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ฌํฉ๋๋ค.
- ์ฌ์ฉ์ ์ ๋ณด ํธ์ถ : Access Token์ ์ฌ์ฉํด API๋ก ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํฉ๋๋ค.
2. ๊ตฌ๊ธ OAuth 2.0 ๋ก๊ทธ์ธ ๊ตฌํ ์์
์๋ ์์ ๋ Flask์ ๊ตฌ๊ธ OAuth ๋ฅผ ์ฌ์ฉํ ๋ก๊ทธ์ธ ๊ตฌํ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
from flask import Flask, redirect, request, session, url_for
import requests
app = Flask(__name__)
app.secret_key = 'your_secret_key'
CLIENT_ID = 'your_google_client_id'
CLIENT_SECRET = 'your_google_client_secret'
REDIRECT_URI = 'http://localhost:5000/callback'
AUTH_URL = 'https://accounts.google.com/o/oauth2/auth'
TOKEN_URL = 'https://accounts.google.com/o/oauth2/token'
USER_INFO_URL = 'https://www.googleapis.com/oauth2/v1/userinfo'
@app.route('/')
def home():
return '<a href="/login">๊ตฌ๊ธ ๋ก๊ทธ์ธ</a>'
@app.route('/login')
def login():
auth_url = f"{AUTH_URL}?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')
token_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()
access_token = token_response['access_token']
user_info = requests.get(USER_INFO_URL, headers={
'Authorization': f'Bearer {access_token}'
}).json()
return f"Hello, {user_info['email']}!"
if __name__ == '__main__':
app.run(debug=True)
์์ ๋ก๊ทธ์ธ์ ํ์์ฑ๊ณผ OAuth 2.0์ ์ญํ
์์ ๋ก๊ทธ์ธ์ ์ฌ์ฉ์๊ฐ ๋ณ๋์ ๊ณ์ ์ ๋ง๋ค ํ์ ์์ด ๊ธฐ์กด ์์ ๊ณ์ ์ ์ฌ์ฉํด ์๋น์ค์ ๋ก๊ทธ์ธํ ์ ์๊ฒ ๋์์ค๋๋ค. OAuth 2.0 ์ ์ด๋ฌํ ์์ ๋ก๊ทธ์ธ์์ ์์ ํ ์ธ์ฆ๊ณผ ๊ถํ ๋ถ์ฌ ๋ฅผ ๋ด๋นํ๋ ํต์ฌ ํ๋กํ ์ฝ์ ๋๋ค. ๊ตฌ๊ธ, ํ์ด์ค๋ถ, ์นด์นด์ค์ ๊ฐ์ ์ ๊ณต์๊ฐ OAuth ํ์ค ์ ์ฌ์ฉํด API๋ฅผ ์ ๊ณตํฉ๋๋ค.
1. ์์ ๋ก๊ทธ์ธ ๊ตฌํ ํ๋ฆ
- ์ฌ์ฉ์ ๋ก๊ทธ์ธ ์์ฒญ : ์ฌ์ฉ์๊ฐ ์์ ๋ก๊ทธ์ธ ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
- OAuth ์ ๊ณต์์ ์ธ์ฆ ์ฐ๋ : ์ฌ์ฉ์๋ ์์ ์๋น์ค์ ์ธ์ฆํ๊ณ ๊ถํ์ ๋ถ์ฌ ํฉ๋๋ค.
- Access Token ๋ฐ๊ธ : ์ ๊ณต์๋ Access Token์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ฌํฉ๋๋ค.
- ์ฌ์ฉ์ ์ ๋ณด ํธ์ถ : Access Token์ ์ฌ์ฉํด API๋ก ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํฉ๋๋ค.
2. ๊ตฌ๊ธ OAuth 2.0 ๋ก๊ทธ์ธ ๊ตฌํ ์์
์๋ ์์ ๋ Flask์ ๊ตฌ๊ธ OAuth ๋ฅผ ์ฌ์ฉํ ๋ก๊ทธ์ธ ๊ตฌํ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
from flask import Flask, redirect, request, session, url_for
import requests
app = Flask(__name__)
app.secret_key = 'your_secret_key'
CLIENT_ID = 'your_google_client_id'
CLIENT_SECRET = 'your_google_client_secret'
REDIRECT_URI = 'http://localhost:5000/callback'
AUTH_URL = 'https://accounts.google.com/o/oauth2/auth'
TOKEN_URL = 'https://accounts.google.com/o/oauth2/token'
USER_INFO_URL = 'https://www.googleapis.com/oauth2/v1/userinfo'
@app.route('/')
def home():
return '<a href="/login">๊ตฌ๊ธ ๋ก๊ทธ์ธ</a>'
@app.route('/login')
def login():
auth_url = f"{AUTH_URL}?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')
token_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()
access_token = token_response['access_token']
user_info = requests.get(USER_INFO_URL, headers={
'Authorization': f'Bearer {access_token}'
}).json()
return f"Hello, {user_info['email']}!"
if __name__ == '__main__':
app.run(debug=True)
์ค๋ช : ์ฌ์ฉ์๋ ๊ตฌ๊ธ ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธํ ํ, Access Token ์ ์ฌ์ฉํด ์ด๋ฉ์ผ ์ ๋ณด๋ฅผ ์กฐํํ ์ ์์ต๋๋ค.
3. Redirect URI ์ค์ ๊ณผ ๋ณด์ ๊ณ ๋ ค์ฌํญ
Redirect URI ์ค์
- ์ ํํ URL : ์ ๊ณต์ ์ฝ์์ ๋ฑ๋ก๋ Redirect URI์ ์ผ์นํด์ผ ํฉ๋๋ค.
- HTTPS ์ฌ์ฉ : ๋ฏผ๊ฐํ ์ ๋ณด๊ฐ ์ค๊ฐ๋ ๊ฒฝ์ฐ HTTPS ๋ฅผ ์ฌ์ฉํด ์ ์กํฉ๋๋ค.
- PKCE ์ ์ฉ : ๊ณต๊ฐ ํด๋ผ์ด์ธํธ(๋ชจ๋ฐ์ผ ์ฑ)์์๋ PKCE ๋ฅผ ์ฌ์ฉํด ๋ณด์์ ๊ฐํํฉ๋๋ค.
์์: Redirect URI ๊ตฌ์ฑ
https://example.com/callback
๋ณด์ ๊ณ ๋ ค์ฌํญ
- Access Token ๋ณดํธ : Access Token์ ๋ ธ์ถ๋์ง ์๋๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค.
- Scope ์ต์ํ : ์ต์ํ์ ๊ถํ๋ง ์์ฒญํด ์ฌ์ฉ์ ์ ๋ขฐ๋ฅผ ๋์ ๋๋ค.
- ์ธ์ ํ์์์ : ๋ก๊ทธ์ธ ์ธ์ ๋ง๋ฃ ์๊ฐ์ ์ค์ ํด ๋ณด์์ ๊ฐํํฉ๋๋ค.
4. ์ฌ์ฉ์ ๋ฐ์ดํฐ ์์ง๊ณผ ๊ฐ์ธ์ ๋ณด ๋ณดํธ
์ฌ์ฉ์ ๋ฐ์ดํฐ ์์ฒญ ์ ์ฃผ์์ฌํญ
- ํ์ ์ ๋ณด๋ง ์์ฒญ : ์ด๋ฉ์ผ, ์ด๋ฆ ๋ฑ ์ต์ํ์ ์ ๋ณด๋ง ์์ฒญํฉ๋๋ค.
- ํฌ๋ช ํ ๊ฐ์ธ์ ๋ณด ์ฒ๋ฆฌ : ์ฌ์ฉ์๊ฐ ๋์ํ ๋ฒ์ ๋ด์์๋ง ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ๊ฐ์ธ์ ๋ณด ๋ณดํธ ์ ์ฑ ์ค์ : ์์งํ ๋ฐ์ดํฐ๋ ๊ด๋ จ ๋ฒ๊ท ์ ๋ฐ๋ผ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค.
5. ์์ ๋ก๊ทธ์ธ ํธ๋ ๋์ ํ์ฉ ํํฉ
- ์์ ๋ก๊ทธ์ธ ์ฌ์ฉ ์ฆ๊ฐ : ํ๊ตญ์์๋ ์นด์นด์ค์ ๋ค์ด๋ฒ ์์ ๋ก๊ทธ์ธ์ด ๋ง์ด ์ฌ์ฉ๋ฉ๋๋ค.
- ๋ฉํฐ ๋ก๊ทธ์ธ ์ง์ : ๊ตฌ๊ธ, ํ์ด์ค๋ถ, ์นด์นด์ค ๋ฑ ๋ค์ํ ์ ๊ณต์๋ฅผ ํตํด ๋ค์ค ๋ก๊ทธ์ธ ํ๊ฒฝ์ ์ง์ํฉ๋๋ค.
- ๊ฐ์ธ์ ๋ณด ๋ณดํธ ๊ฐํ : GDPR ๋ฐ ๊ฐ์ธ์ ๋ณด ๋ณดํธ๋ฒ์ ๋ฐ๋ผ ๋ฐ์ดํฐ ์์ง๊ณผ ์ฌ์ฉ์ด ๋์ฑ ํฌ๋ช ํด์ง๊ณ ์์ต๋๋ค.
FAQ
Q1. ์์
๋ก๊ทธ์ธ ๊ตฌํ ์ ์ด๋ค ์ ์ ์ฃผ์ํด์ผ ํ๋์?
A1. Redirect URI์ ์ค์ฝํ ์ค์ ์ ์ ํํ ํ๊ณ , Access Token์ ์์ ํ๊ฒ ๊ด๋ฆฌ ํด์ผ ํฉ๋๋ค.
Q2. ์์
๋ก๊ทธ์ธ์์ PKCE๋ ์ธ์ ์ฌ์ฉํด์ผ ํ๋์?
A2. ๋ชจ๋ฐ์ผ ์ฑ๊ณผ ๊ฐ์ ๊ณต๊ฐ ํด๋ผ์ด์ธํธ ์์๋ PKCE๋ฅผ ์ฌ์ฉํด ๋ณด์์ ๊ฐํํด์ผ ํฉ๋๋ค.
Q3. ์ฌ์ฉ์๊ฐ ๋์ํ ์ ๋ณด ์ธ์ ์ถ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์์งํ ์ ์๋์?
A3. ์ฌ์ฉ์ ๋์ ์์ด ์ถ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์์งํ๋ ๊ฒ์ ๊ธ์ง ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท๋ฅผ ์ค์ํด์ผ ํฉ๋๋ค.
Q4. ์ฌ๋ฌ OAuth ์ ๊ณต์๋ฅผ ๋์์ ์ง์ํ ์ ์๋์?
A4. ๋ค, ๊ตฌ๊ธ, ํ์ด์ค๋ถ, ์นด์นด์ค ๋ฑ ๋ค์ค ์ ๊ณต์ ๋ฅผ ์ง์ํ๋ ์์
๋ก๊ทธ์ธ ๊ตฌํ์ด ๊ฐ๋ฅํฉ๋๋ค.
Q5. Access Token์ ์ผ๋ง๋ ์์ฃผ ๊ฐฑ์ ํด์ผ ํ๋์?
A5. Access Token์ ์ผ๋ฐ์ ์ผ๋ก ์งง์ ์ ํจ ์๊ฐ ์ ๊ฐ์ง๋ฉฐ, ๋ง๋ฃ ํ Refresh Token ์ ์ฌ์ฉํด ๊ฐฑ์ ํฉ๋๋ค.
'IT' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
OAuth 2.0์ ๋ณด์ ์ด์์ ํด๊ฒฐ ๋ฐฉ์: ์์ ํ ์ธ์ฆ ์์คํ ๊ตฌ์ถํ๊ธฐ (0) | 2024.10.20 |
---|---|
๊ตฌ๊ธ OAuth ์ค์ (0) | 2024.10.19 |
ํ ํฐ ๋ง๋ฃ ์ฒ๋ฆฌ์ ๋ณด์ ์ฌ๊ณ ๋์ (0) | 2024.10.18 |
OAuth 2.0์ ํต์ฌ ์์์ ํ ํฐ ๊ด๋ฆฌ: ํจ์จ์ ์ธ ์ธ์ฆ ์์คํ ๊ตฌ์ถํ๊ธฐ (0) | 2024.10.18 |
OAuth 2.0์ ๊ถํ ๋ถ์ฌ ๋ฐฉ์ ์ ํ ์ ๊ณ ๋ คํ ์ (0) | 2024.10.18 |
๋๊ธ