๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

ํ† ํฐ ๋งŒ๋ฃŒ ์ฒ˜๋ฆฌ์™€ ๋ณด์•ˆ ์‚ฌ๊ณ  ๋Œ€์‘

mrmount 2024. 10. 18.

 

 

ํ† ํฐ ๋งŒ๋ฃŒ ์ฒ˜๋ฆฌ์™€ ๋ณด์•ˆ ์‚ฌ๊ณ  ๋Œ€์‘

 

1. ํ† ํฐ ๋งŒ๋ฃŒ ์ฒ˜๋ฆฌ ์ „๋žต

  • Access Token ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์งง์€ ์œ ํšจ ์‹œ๊ฐ„ ์„ ๊ฐ€์ง€๋ฉฐ, ์ผ์ • ์‹œ๊ฐ„ ํ›„ ๋งŒ๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
  • Refresh Token ์„ ์‚ฌ์šฉํ•ด ์ƒˆ๋กœ์šด Access Token์„ ๋ฐœ๊ธ‰๋ฐ›๋Š” ๋กœ์ง์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

Access Token ๋งŒ๋ฃŒ ์‹œ ์ฒ˜๋ฆฌ ์˜ˆ์ œ

import requests

def get_new_access_token(refresh_token):
    response = requests.post(
        "https://api.example.com/oauth/token",
        data={
            "grant_type": "refresh_token",
            "refresh_token": refresh_token,
            "client_id": "your_client_id",
            "client_secret": "your_client_secret"
        }
    )
    return response.json().get("access_token")

refresh_token = "your_refresh_token"
new_access_token = get_new_access_token(refresh_token)
print(f"์ƒˆ๋กœ์šด Access Token: {new_access_token}")

 


 

ํ† ํฐ ๋งŒ๋ฃŒ ์ฒ˜๋ฆฌ์™€ ๋ณด์•ˆ ์‚ฌ๊ณ  ๋Œ€์‘

 

1. ํ† ํฐ ๋งŒ๋ฃŒ ์ฒ˜๋ฆฌ ์ „๋žต

  • Access Token ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์งง์€ ์œ ํšจ ์‹œ๊ฐ„ ์„ ๊ฐ€์ง€๋ฉฐ, ์ผ์ • ์‹œ๊ฐ„ ํ›„ ๋งŒ๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
  • Refresh Token ์„ ์‚ฌ์šฉํ•ด ์ƒˆ๋กœ์šด Access Token์„ ๋ฐœ๊ธ‰๋ฐ›๋Š” ๋กœ์ง์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

Access Token ๋งŒ๋ฃŒ ์‹œ ์ฒ˜๋ฆฌ ์˜ˆ์ œ

import requests

def get_new_access_token(refresh_token):
    response = requests.post(
        "https://api.example.com/oauth/token",
        data={
            "grant_type": "refresh_token",
            "refresh_token": refresh_token,
            "client_id": "your_client_id",
            "client_secret": "your_client_secret"
        }
    )
    return response.json().get("access_token")

refresh_token = "your_refresh_token"
new_access_token = get_new_access_token(refresh_token)
print(f"์ƒˆ๋กœ์šด Access Token: {new_access_token}")

์„ค๋ช…: ๋งŒ๋ฃŒ๋œ Access Token์„ Refresh Token ์„ ํ†ตํ•ด ์ƒˆ๋กœ ๋ฐœ๊ธ‰๋ฐ›๋Š” ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.

2. ๋ณด์•ˆ ์‚ฌ๊ณ  ๋ฐœ์ƒ ์‹œ ๋Œ€์‘

  • Refresh Token ์œ ์ถœ ์‹œ : ๋ชจ๋“  Access Token๊ณผ Refresh Token์„ ์ฆ‰์‹œ ๋งŒ๋ฃŒ ํ•˜๊ณ  ์žฌ๋ฐœ๊ธ‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํ† ํฐ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ์‚ฌ์šฉ : ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜๊ฑฐ๋‚˜ ์œ ์ถœ๋œ ๊ฒฝ์šฐ, ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ์— ๋“ฑ๋ก ํ•ด API ์ ‘๊ทผ์„ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.

 

ํ† ํฐ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ์˜ˆ์ œ

from datetime import datetime, timedelta

blacklist = {}

def blacklist_token(token):
    blacklist[token] = datetime.now() + timedelta(minutes=30)

def is_token_blacklisted(token):
    return token in blacklist and blacklist[token] > datetime.now()

access_token = "example_token"
blacklist_token(access_token)

print(is_token_blacklisted(access_token))  # True

์„ค๋ช…: ์ด ์ฝ”๋“œ์—์„œ๋Š” ํŠน์ • ํ† ํฐ์„ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ์— ๋“ฑ๋กํ•ด ๋งŒ๋ฃŒ๋˜๊ธฐ ์ „๊นŒ์ง€ ์ ‘๊ทผ์„ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.

 


 

OAuth 2.0 ํ† ํฐ ์‚ฌ์šฉ ์‹œ์˜ ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ์™€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

 

1. ๋งŒ๋ฃŒ๋œ ํ† ํฐ ์‚ฌ์šฉ์œผ๋กœ ์ธํ•œ ์˜ค๋ฅ˜

  • ๋ฌธ์ œ: ์‚ฌ์šฉ์ž๊ฐ€ ๋งŒ๋ฃŒ๋œ Access Token์œผ๋กœ API๋ฅผ ํ˜ธ์ถœํ•  ๊ฒฝ์šฐ, 401 Unauthorized ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ํ•ด๊ฒฐ: 401 ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ์ž๋™์œผ๋กœ Refresh Token ์„ ์‚ฌ์šฉํ•ด ์ƒˆ๋กœ์šด Access Token์„ ๋ฐœ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.

2. Refresh Token ์œ ์ถœ

  • ๋ฌธ์ œ: Refresh Token์ด ์œ ์ถœ๋˜๋ฉด ์žฅ๊ธฐ์ ์œผ๋กœ ์‹œ์Šคํ…œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์œ„ํ—˜์ด ์ƒ๊น๋‹ˆ๋‹ค.
  • ํ•ด๊ฒฐ: ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ ์„ ํ†ตํ•ด ๋น„์ •์ƒ์ ์ธ ์‚ฌ์šฉ์„ ๊ฐ์ง€ํ•˜๊ณ , ์ฆ‰์‹œ ํ† ํฐ์„ ๋ฌดํšจํ™”ํ•ฉ๋‹ˆ๋‹ค.

3. ์Šค์ฝ”ํ”„ ์„ค์ • ๋ฌธ์ œ

  • ๋ฌธ์ œ: ์ž˜๋ชป๋œ ์Šค์ฝ”ํ”„ ์„ค์ •์œผ๋กœ ํ•„์š”ํ•œ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ํ•ด๊ฒฐ: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์š”์ฒญํ•˜๋Š” ์Šค์ฝ”ํ”„๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜ ํ•˜๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ ํˆฌ๋ช…ํ•˜๊ฒŒ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 


 

OAuth 2.0๊ณผ JWT๋ฅผ ํ™œ์šฉํ•œ API ์„ค๊ณ„ ๋ชจ๋ฒ” ์‚ฌ๋ก€

  1. JWT ํ† ํฐ ์„œ๋ช… ๊ฒ€์ฆ ํ•„์ˆ˜ํ™”
    - ์„œ๋ฒ„๋Š” JWT๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐ˜๋“œ์‹œ ์„œ๋ช…(Signature) ์„ ๊ฒ€์ฆํ•ด ํ† ํฐ์˜ ์œ„๋ณ€์กฐ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  2. ํ† ํฐ ๋งŒ๋ฃŒ ํ›„ Refresh Token ํ™œ์šฉ
    - Access Token ๋งŒ๋ฃŒ ์‹œ ์ž๋™์œผ๋กœ Refresh Token์„ ์‚ฌ์šฉ ํ•ด ๊ฐฑ์‹  ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ„์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.
  3. HTTPS๋ฅผ ํ†ตํ•œ ์•ˆ์ „ํ•œ ํ†ต์‹ 
    - ๋ชจ๋“  ํ† ํฐ์€ HTTPS๋ฅผ ํ†ตํ•ด ์ „์†ก ํ•ด ๋„คํŠธ์›Œํฌ ์ค‘๊ฐ„์—์„œ ํƒˆ์ทจ๋˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  4. ์ตœ์†Œ ๊ถŒํ•œ ์›์น™ ์ค€์ˆ˜
    - ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ๊ถŒํ•œ๋งŒ ๋ถ€์—ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 


 

๊ฒฐ๋ก : ์•ˆ์ „ํ•˜๊ณ  ํšจ์œจ์ ์ธ OAuth 2.0 ํ† ํฐ ๊ด€๋ฆฌ

OAuth 2.0์˜ ํ•ต์‹ฌ์€ ํ† ํฐ์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌ ํ•˜๊ณ , ๋งŒ๋ฃŒ ๋ฐ ๊ฐฑ์‹  ๊ณผ์ •์„ ํšจ์œจ์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Access Token๊ณผ Refresh Token์˜ ์—ญํ• ์„ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ ํ•˜๊ณ , JWT๋ฅผ ์‚ฌ์šฉํ•ด ํ™•์žฅ์„ฑ๊ณผ ๋ณด์•ˆ ์„ ๋ชจ๋‘ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ตœ์‹  OAuth 2.1 ํ‘œ์ค€์„ ์ค€์ˆ˜ํ•˜๊ณ , PKCE์™€ ๊ฐ™์€ ๋ณด์•ˆ ๊ฐ•ํ™”๋ฅผ ํ†ตํ•ด ์•ˆ์ „ํ•œ ์ธ์ฆ ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•˜์„ธ์š”.

 


 

FAQ

Q1. Refresh Token์„ ํ•ญ์ƒ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋‚˜์š”?
A1. ์žฅ๊ธฐ ์„ธ์…˜ ์„ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ Refresh Token ์‚ฌ์šฉ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค. ๋‹จ๊ธฐ ์„ธ์…˜์—์„œ๋Š” Access Token๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Q2. JWT๋Š” ๋ชจ๋“  API์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ๊ฐ€์š”?
A2. JWT๋Š” ํ™•์žฅ์„ฑ ๊ณผ ์ž์ฒด ๊ฒ€์ฆ ๊ธฐ๋Šฅ ๋•๋ถ„์— ๋‹ค์–‘ํ•œ API ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

Q3. ๋งŒ๋ฃŒ๋œ ํ† ํฐ์„ ์ž๋™์œผ๋กœ ๊ฐฑ์‹ ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€์š”?
A3. 401 Unauthorized ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ Refresh Token ์„ ์‚ฌ์šฉํ•ด ์ž๋™ ๊ฐฑ์‹ ํ•˜๋Š” ๋กœ์ง์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

Q4. Refresh Token์„ ์–ด๋–ป๊ฒŒ ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‚˜์š”?
A4. Refresh Token์€ HTTPS๋ฅผ ํ†ตํ•ด ์ „์†ก ํ•˜๋ฉฐ, ์„œ๋ฒ„ ์ธก์— ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Q5. ํ† ํฐ ๊ด€๋ฆฌ ์‹œ ์ฃผ์˜ํ•  ์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?
A5. ํ† ํฐ์˜ ์œ ํšจ ๊ธฐ๊ฐ„ ์„ ์งง๊ฒŒ ์œ ์ง€ํ•˜๊ณ , ํ•„์š” ์‹œ Refresh Token์„ ์‚ฌ์šฉํ•ด ์ƒˆ๋กœ ๋ฐœ๊ธ‰ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

 


๋Œ“๊ธ€