OAuth 2.0์ ํต์ฌ ์์์ ํ ํฐ ๊ด๋ฆฌ: ํจ์จ์ ์ธ ์ธ์ฆ ์์คํ ๊ตฌ์ถํ๊ธฐ
OAuth 2.0์์์ ํ ํฐ์ ์ญํ
OAuth 2.0์์๋ Access Token ๊ณผ Refresh Token ์ ์ฌ์ฉํด ์ธ์ฆ๊ณผ ๊ถํ ๋ถ์ฌ ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ์ด ํ ํฐ๋ค์ ์ฌ์ฉ์์ ์๊ฒฉ ์ฆ๋ช ์ ๋์ ํ์ฌ API ํธ์ถ์ ๋ํ ์ ๊ทผ ๊ถํ ์ ๋ถ์ฌํ๋ฉฐ, ํ์์ ๋ฐ๋ผ JWT(JSON Web Token) ํ์์ผ๋ก ๋ฐ๊ธ๋ฉ๋๋ค.
1. Access Token๊ณผ Refresh Token์ ์ฐจ์ด
ํ ํฐ ์ ํ | ์ค๋ช | ์ฌ์ฉ ์์ |
---|---|---|
Access Token | API์ ๋ํ ๋จ๊ธฐ ์ ๊ทผ ๊ถํ ์ ๋ถ์ฌ | ์ฌ์ฉ์ ์ ๋ณด API ํธ์ถ |
Refresh Token | ๋ง๋ฃ๋ Access Token์ ๊ฐฑ์ ํ๋ ๋ฐ ์ฌ์ฉ | Access Token ๋ง๋ฃ ํ ์ ํ ํฐ ๋ฐ๊ธ |
Access Token์ ํน์ง
- ์งง์ ์ ํจ ๊ธฐ๊ฐ (์ผ๋ฐ์ ์ผ๋ก ์ ๋ถ~์ ์๊ฐ) ๋์ ์ ํจํฉ๋๋ค.
- API ํธ์ถ ์ ํค๋์ ํฌํจ ๋์ด ์ฌ์ฉ๋ฉ๋๋ค.
์์: Access Token์ ์ฌ์ฉํ API ํธ์ถ
import requests
access_token = "your_access_token"
url = "https://api.example.com/user"
headers = {
"Authorization": f"Bearer {access_token}"
}
response = requests.get(url, headers=headers)
print(response.json())
OAuth 2.0์์์ ํ ํฐ์ ์ญํ
OAuth 2.0์์๋ Access Token ๊ณผ Refresh Token ์ ์ฌ์ฉํด ์ธ์ฆ๊ณผ ๊ถํ ๋ถ์ฌ ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ์ด ํ ํฐ๋ค์ ์ฌ์ฉ์์ ์๊ฒฉ ์ฆ๋ช ์ ๋์ ํ์ฌ API ํธ์ถ์ ๋ํ ์ ๊ทผ ๊ถํ ์ ๋ถ์ฌํ๋ฉฐ, ํ์์ ๋ฐ๋ผ JWT(JSON Web Token) ํ์์ผ๋ก ๋ฐ๊ธ๋ฉ๋๋ค.
1. Access Token๊ณผ Refresh Token์ ์ฐจ์ด
ํ ํฐ ์ ํ | ์ค๋ช | ์ฌ์ฉ ์์ |
---|---|---|
Access Token | API์ ๋ํ ๋จ๊ธฐ ์ ๊ทผ ๊ถํ ์ ๋ถ์ฌ | ์ฌ์ฉ์ ์ ๋ณด API ํธ์ถ |
Refresh Token | ๋ง๋ฃ๋ Access Token์ ๊ฐฑ์ ํ๋ ๋ฐ ์ฌ์ฉ | Access Token ๋ง๋ฃ ํ ์ ํ ํฐ ๋ฐ๊ธ |
Access Token์ ํน์ง
- ์งง์ ์ ํจ ๊ธฐ๊ฐ (์ผ๋ฐ์ ์ผ๋ก ์ ๋ถ~์ ์๊ฐ) ๋์ ์ ํจํฉ๋๋ค.
- API ํธ์ถ ์ ํค๋์ ํฌํจ ๋์ด ์ฌ์ฉ๋ฉ๋๋ค.
์์: Access Token์ ์ฌ์ฉํ API ํธ์ถ
import requests
access_token = "your_access_token"
url = "https://api.example.com/user"
headers = {
"Authorization": f"Bearer {access_token}"
}
response = requests.get(url, headers=headers)
print(response.json())
์ค๋ช
: Access Token์
Authorization
ํค๋ ์ ํฌํจํด API๋ฅผ ํธ์ถํฉ๋๋ค.
Refresh Token์ ํน์ง
- ๋ ๊ธด ์ ํจ ๊ธฐ๊ฐ ์ ๊ฐ์ง๋ฉฐ, Access Token ๋ง๋ฃ ์ ์๋ก ๋ฐ๊ธํฉ๋๋ค.
- ๋ ธ์ถ ์ ์ํ ์ด ์์ผ๋ฏ๋ก ๋ณด์์ด ์ค์ํ ํ๊ฒฝ์์ ์ฌ์ฉ๋ฉ๋๋ค.
์์: Refresh Token์ผ๋ก ์ Access Token ๋ฐ๊ธ
response = requests.post(
"https://api.example.com/oauth/token",
data={
"grant_type": "refresh_token",
"refresh_token": "your_refresh_token",
"client_id": "your_client_id",
"client_secret": "your_client_secret",
}
)
new_access_token = response.json().get("access_token")
print(f"New Access Token: {new_access_token}")
์ค๋ช : ๋ง๋ฃ๋ Access Token์ Refresh Token ์ ์ฌ์ฉํด ์๋ก ๋ฐ๊ธ๋ฐ์ ์ ์์ต๋๋ค.
2. Token Scope์ Expiration: ๊ถํ๊ณผ ์ ํจ ๊ธฐ๊ฐ ๊ด๋ฆฌ
Token Scope(์ค์ฝํ)
Scope ๋ ํ ํฐ์ ๋ถ์ฌ๋ ๊ถํ์ ๋ฒ์ ๋ฅผ ์ ์ํฉ๋๋ค. ์ฌ์ฉ์๋ ํน์ ๋ฆฌ์์ค์๋ง ์ ๊ทผ์ ํ์ฉํ ์ ์์ผ๋ฉฐ, ๊ฐ ์ค์ฝํ๋ ๊ฐ๋ณ์ ์ผ๋ก ์ค์ ๋ฉ๋๋ค.
์ค์ฝํ | ์ค๋ช |
---|---|
read:user
|
์ฌ์ฉ์ ์ ๋ณด ์ฝ๊ธฐ |
write:post
|
๊ฒ์๋ฌผ ์์ฑ ๊ถํ ๋ถ์ฌ |
read:email
|
์ด๋ฉ์ผ ์ฃผ์ ์ฝ๊ธฐ ๊ถํ |
์์: ์ค์ฝํ๊ฐ ํฌํจ๋ ๊ถํ ๋ถ์ฌ ์์ฒญ
https://accounts.example.com/oauth/authorize?response_type=code
&client_id=your_client_id
&redirect_uri=https://yourapp.com/callback
&scope=read:user write:post
Token Expiration(์ ํจ ๊ธฐ๊ฐ)
- Access Token์ ์งง์ ์ ํจ ๊ธฐ๊ฐ์ ๊ฐ์ง๋ฉฐ, ๋ณด์์ ์ํด ์์ฃผ ๋ง๋ฃ๋ฉ๋๋ค.
- Refresh Token์ ๋ ๊ธด ์ ํจ ๊ธฐ๊ฐ ์ ๊ฐ์ง์ง๋ง, ๋ณด์ ์ฌ๊ณ ์ ๋ ธ์ถ ์ํ์ด ํฝ๋๋ค.
3. JWT(JSON Web Token)์ ์ฌ์ฉ
JWT ๋ OAuth 2.0์์ Access Token ์ ํ ํ์์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค. JWT๋ Base64๋ก ์ธ์ฝ๋ฉ๋ JSON ํ์์ ํ ํฐ ์ผ๋ก, ์ฝ๊ฒ ๊ฒ์ฆํ ์ ์์ผ๋ฉฐ ๋ค์ํ ์์คํ ์์ ํ์ฉ๋ฉ๋๋ค.
JWT์ ๊ตฌ์กฐ
JWT๋ ํค๋(Header), ํ์ด๋ก๋(Payload), ์๋ช (Signature) ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
header.payload.signature
์์: JWT ๋์ฝ๋ฉ
import jwt
encoded_jwt = "your_jwt_token"
decoded = jwt.decode(encoded_jwt, options={"verify_signature": False})
print(decoded)
์์ JWT Payload
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022,
"exp": 1516242622,
"scope": "read:user"
}
์ค๋ช : JWT๋ ์ ํจ ๊ธฐ๊ฐ๊ณผ ์ค์ฝํ ์ ๋ณด๋ฅผ ํฌํจํ ์ ์์ด ๊ฒ์ฆ์ด ๊ฐํธ ํฉ๋๋ค.
4. ํ ํฐ ๊ด๋ฆฌ ์ ๋ต: ๋ณด์๊ณผ ํจ์จ์ฑ์ ๊ท ํ
- ํ ํฐ ์ฃผ๊ธฐ์ ์ผ๋ก ๊ฐฑ์
Access Token์ ์์ฃผ ๊ฐฑ์ ํด ํ์ทจ ์ํ ์ ์ต์ํํฉ๋๋ค. - Refresh Token ๋ณดํธ
Refresh Token์ ๋ฏผ๊ฐํ ์ ๋ณด์ด๋ฏ๋ก HTTPS๋ฅผ ์ฌ์ฉ ํด ์ ์กํฉ๋๋ค. - ์ค์ฝํ ์ต์ํ
ํ์ํ ๋ฒ์์ ๊ถํ๋ง ๋ถ์ฌํ๋ ์ต์ ๊ถํ ์์น ์ ์ค์ํฉ๋๋ค. - JWT ์ฌ์ฉ ์ ์๋ช
๊ฒ์ฆ
JWT๋ ์๋ช (Signature) ์ ํตํด ๋ฌด๊ฒฐ์ฑ์ ๊ฒ์ฆํด์ผ ํฉ๋๋ค.
OAuth 2.0 ํ ํฐ ๊ด๋ฆฌ์ ์ต์ ํธ๋ ๋
- PKCE ์ ํจ๊ป Access Token์ ์ฌ์ฉํด ๋ชจ๋ฐ์ผ ์ฑ์ ๋ณด์์ ๊ฐํํฉ๋๋ค.
- OAuth 2.1 ์์๋ ๋ณด์์ ์ํด ํ ํฐ์ ์ ํจ ๊ธฐ๊ฐ์ ๋์ฑ ๋จ์ถํ๊ณ ์ฃผ๊ธฐ์ ์ผ๋ก ๊ฐฑ์ ํฉ๋๋ค.
- JWT๋ ์ค์ผ์ผ๋ง์ ์ ๋ฆฌ ํ๋ฉฐ, ํด๋ผ์ฐ๋ ํ๊ฒฝ์์ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค.
FAQ
Q1. Access Token๊ณผ Refresh Token์ ์ฐจ์ด์ ์ ๋ฌด์์ธ๊ฐ์?
A1. Access Token์ ๋จ๊ธฐ์ ์ธ API ์ ๊ทผ ์ ์ฌ์ฉ๋๋ฉฐ, Refresh Token์ ์๋ก์ด Access Token ๋ฐ๊ธ ์ ์ฌ์ฉ๋ฉ๋๋ค.
Q2. JWT์ ์ผ๋ฐ Access Token์ ์ฐจ์ด๋ ๋ฌด์์ธ๊ฐ์?
A2. JWT๋ Base64 ์ธ์ฝ๋ฉ๋ JSON ํ์ ์ผ๋ก ์์ฒด์ ์ผ๋ก ์๋ช
๋ฐ ๊ฒ์ฆ์ด ๊ฐ๋ฅํฉ๋๋ค.
Q3. Refresh Token์ ํญ์ ๋ฐ๊ธํด์ผ ํ๋์?
A3. ๋ชจ๋ ๊ฒฝ์ฐ์ ํ์ํ ๊ฒ์ ์๋์ง๋ง, ์ฅ๊ธฐ ์ธ์
์ ์ง์ํ๋ ๊ฒฝ์ฐ Refresh Token ๋ฐ๊ธ์ด ๊ถ์ฅ๋ฉ๋๋ค.
Q4. JWT์ ๋ง๋ฃ ์๊ฐ์ ์ด๋ป๊ฒ ์ค์ ํ๋์?
A4. JWT์
exp
(expiration) ํ๋๋ฅผ ์ฌ์ฉํด ๋ง๋ฃ ์๊ฐ์ ์ค์ ํฉ๋๋ค.
Q5. ํ ํฐ ํ์ทจ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ธ๊ฐ์?
A5. HTTPS ์ฌ์ฉ ๊ณผ ์ฃผ๊ธฐ์ ์ธ ํ ํฐ ๊ฐฑ์ ์ผ๋ก ํ ํฐ ํ์ทจ ์ํ์ ์ต์ํํฉ๋๋ค.
๋๊ธ