OAuth와 JWT

μ†‘μœ€μž¬Β·2024λ…„ 9μ›” 2일

πŸ’‘μΈμ¦ VS 인가

인증(Authentication)

인증은 μ–΄λ–€ 사싀 λ˜λŠ” μ–΄λ–€ λ¬Έμ„œκ°€ μ§„μ§œμΈμ§€ 증λͺ…ν•˜λŠ” 과정을 κ°€λ¦¬ν‚€λŠ” μš©μ–΄μž…λ‹ˆλ‹€.
일반적으둜 컴퓨터 κ³Όν•™ λΆ„μ•Όμ—μ„œλŠ” μ‚¬μš©μžμ˜ 신원을 증λͺ…ν•˜λŠ” 것과 관련이 μžˆμŠ΅λ‹ˆλ‹€.
μ‚¬μš©μžλŠ” μ‚¬μš©μžμ™€ μ‹œμŠ€ν…œκ°„μ— κ³΅μœ λ˜λŠ” ν•©μ˜λœ 정보λ₯Ό μ œκ³΅ν•˜μ—¬ μžμ‹ μ˜ 신원을 증λͺ…ν•©λ‹ˆλ‹€.

μ—¬λŸ¬ μ›Ή μ„œλΉ„μŠ€λ“€μ€ νšŒμ›μ΄μ–΄μ•Ό 만이 μ΄μš©ν•  수 μžˆλŠ” κ²½μš°κ°€ λ§Žλ‹€.
νšŒμ›μ΄ 아닐 κ²½μš°μ—λŠ” ν•΄λ‹Ή μ„œλΉ„μŠ€λ₯Ό μ΄μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” νšŒμ› κ°€μž…μ„ 톡해 아이디와 νŒ¨μŠ€μ›Œλ“œλ₯Ό λ§Œλ“€κ³ , νšŒμ› κ°€μž…ν•˜λ €λŠ” μ‚¬μš©μžκ°€ 본인이 λ§žλŠ”μ§€ ν™•μΈν•˜λŠ” 절차λ₯Ό κ°€μ§€κ²Œ λœλ‹€.

νšŒμ›μΌ κ²½μš°μ—λŠ” λ‘œκ·ΈμΈμ„ ν•¨μœΌλ‘œ νšŒμ›μ΄ λ§žμŒμ„ 인증해야 ν•œλ‹€. 아이디와 νŒ¨μŠ€μ›Œλ“œλ₯Ό μž…λ ₯ν•˜μ—¬ 아이디에 ν•΄λ‹Ήν•˜λŠ” νŒ¨μŠ€μ›Œλ“œκ°€ μΌμΉ˜ν•  κ²½μš°μ—λ§Œ 인증 μ ˆμ°¨μ— μ„±κ³΅ν•˜μ—¬ μ„œλΉ„μŠ€λ₯Ό μ΄μš©ν•  수 있게 λœλ‹€.

인가(Authorization)

인증과 달리 κΆŒν•œ λΆ€μ—¬λŠ” μ—”ν„°ν‹°(μ‚¬μš©μž λ˜λŠ” μž₯치)κ°€ μ•‘μ„ΈμŠ€ ν•  수 μžˆλŠ” λ¦¬μ†ŒμŠ€ λ˜λŠ” μˆ˜ν–‰ν•  수 μžˆλŠ” μž‘μ—…,
즉 μ•‘μ„ΈμŠ€ κΆŒν•œμ„ ν™•μΈν•˜λŠ” ν”„λ‘œμ„ΈμŠ€λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

μƒν’ˆμ„ 판맀 λ˜λŠ” ꡬ맀λ₯Ό ν•  수 μžˆλŠ” 인터넷 μ‡Όν•‘λͺ°μ΄ μžˆλ‹€κ³  κ°€μ •ν•œλ‹€.
고객은 ν•΄λ‹Ή μ‡Όν•‘λͺ°μ—μ„œ μƒν’ˆμ„ ꡬ맀할 수 μžˆλŠ” κΆŒν•œμ„ 뢀여받은 것이며, νŒλ§€μžλŠ” μƒν’ˆμ„ λ“±λ‘ν•˜κ³  νŒλ§€ν•  수 μžˆλŠ” κΆŒν•œμ„ 뢀여받은 것이닀.

ν•΄λ‹Ή μ‡Όν•‘λͺ°μ—μ„œλŠ” μ—¬λŸ¬ κ°€μ§€ ν˜•νƒœλ‘œ 인가λ₯Ό ν•  수 μžˆλ‹€.

  • λͺ¨λ“  νšŒμ›μ΄ μƒν’ˆ ꡬ맀와 판맀λ₯Ό λ™μ‹œμ— μ§„ν–‰ν•  수 μžˆλ„λ‘ λͺ¨λ“  κΆŒν•œμ„ λΆ€μ—¬ν•œλ‹€.
  • νšŒμ›μ„ κ΅¬λ§€μžμ™€ 판맀자둜 κ΅¬λΆ„ν•˜μ—¬ κ΅¬λ§€μžλŠ” ꡬ맀만 ν•  수 있고, νŒλ§€μžλŠ” 판맀만 ν•  수 μžˆλ„λ‘ κΆŒν•œμ„ λΆ€μ—¬ν•œλ‹€.
  • λͺ¨λ“  νšŒμ›μ€ ꡬ맀λ₯Ό ν•  수 μžˆμœΌλ‚˜, νŒλ§€μžλŠ” 신청을 톡해 ν†΅κ³Όλœ μ‚¬μš©μžλ§Œ 판맀자 κΆŒν•œμ„ 뢀여받을 수 μžˆλ„λ‘ ν•œλ‹€.

πŸ’‘OAuth

OAuthλž€?

ꡬ글, 페이슀뢁, νŠΈμœ„ν„°μ™€ 같은 λ‹€μ–‘ν•œ ν”Œλž«νΌμ˜ νŠΉμ •ν•œ μ‚¬μš©μž 데이터에 μ ‘κ·Όν•˜κΈ° μœ„ν•΄ 제3자 ν΄λΌμ΄μ–ΈνŠΈ(우리의 μ„œλΉ„μŠ€)κ°€ μ‚¬μš©μžμ˜ μ ‘κ·Ό κΆŒν•œμ„ μœ„μž„(Delegated Authorization) 받을 수 μžˆλŠ” ν‘œμ€€ ν”„λ‘œν† μ½œμ΄λ‹€.
μ‰½κ²Œ λ§ν•˜μžλ©΄, 우리의 μ„œλΉ„μŠ€κ°€ 우리 μ„œλΉ„μŠ€λ₯Ό μ΄μš©ν•˜λŠ” μœ μ €μ˜ 타사 ν”Œλž«νΌ 정보에 μ ‘κ·Όν•˜κΈ° μœ„ν•΄μ„œ κΆŒν•œμ„ 타사 ν”Œλž«νΌμœΌλ‘œλΆ€ν„° μœ„μž„ λ°›λŠ” 것 이닀.

  • OAuth의 주된 λͺ©μ μ€ μ‚¬μš©μžμ˜ 자격 증λͺ…을 제3의 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— μ œκ³΅ν•˜μ§€ μ•Šκ³ λ„, 제3의 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ‚¬μš©μžμ˜ μžμ›(예: 이메일, μ—°λ½μ²˜ λͺ©λ‘ λ“±)에 μ ‘κ·Όν•  수 μžˆλ„λ‘ κΆŒν•œμ„ λΆ€μ—¬ν•˜λŠ” κ²ƒμ΄λ―€λ‘œ 인가(Authorization)에 ν•΄λ‹Ήν•©λ‹ˆλ‹€.

λ“±μž₯λ°°κ²½

  • ν•„μš”μ„±

    우리의 μ„œλΉ„μŠ€κ°€ μ‚¬μš©μžλ₯Ό λŒ€μ‹ ν•˜μ—¬ κ΅¬κΈ€μ˜ μΊ˜λ¦°λ”μ— 일정을 μΆ”κ°€ν•˜κ±°λ‚˜, 페이슀뢁, νŠΈμœ„ν„°μ— 글을 λ‚¨κΈ°λŠ” κΈ°λŠ₯을 λ§Œλ“€ 수 μžˆμ„ 것 이닀. μ΄λ•Œ, κ°€μž₯ μ‰½κ²Œ 이 κΈ°λŠ₯을 κ΅¬ν˜„ν•˜λŠ” 방법은 μ‚¬μš©μžλ‘œλΆ€ν„° ꡬ글, 페이슀뢁, νŠΈμœ„ν„°μ˜ ID, Password λ₯Ό 직접 μ œκ³΅λ°›μ•„ 우리의 μ„œλΉ„μŠ€μ— μ €μž₯ν•˜κ³  ν™œμš©ν•˜λŠ” 방법이닀.
  • μ œν•œμ‚¬ν•­

    우리 μž…μž₯μ—μ„œλŠ” μ‚¬μš©μžμ˜ μ•„μ£Ό λ―Όκ°ν•œ 정보λ₯Ό 직접 μ €μž₯ν•˜κ³  κ΄€λ¦¬ν•΄μ•Όν•œλ‹€λŠ” 뢀담이 생길 것 이닀. λ˜ν•œ ꡬ글, 페이슀뢁, νŠΈμœ„ν„°λŠ” μžμ‹ μ˜ μ‚¬μš©μž 정보λ₯Ό μ‹ λ’°ν•  수 μ—†λŠ” 제3μžμ—κ²Œ λ§‘κΈ΄λ‹€λŠ” 것이 맀우 뢈만쑱슀러울 것 이닀.
  • κ³Όκ±° ν•΄κ²°μ±…

    OAuth κ°€ λ“±μž₯ν•˜κΈ° μ΄μ „μ—λŠ” ꡬ글은 AuthSub, μ•Όν›„λŠ” BBAuth λ“± 각자 νšŒμ‚¬κ°€ κ°œλ°œν•œ 방법을 μ‚¬μš©ν•˜μ˜€λ‹€. ν•˜μ§€λ§Œ 이 방식은 ν‘œμ€€ν™” λ˜μ–΄μžˆμ§€ μ•ŠκΈ° λ•Œλ¬Έμ— ꡬ글과 μ—°λ™ν•˜λŠ” μ„œλΉ„μŠ€λ₯Ό λ§Œλ“€κΈ° μœ„ν•΄μ„œλŠ” AuthSub, 야후와 μ—°λ™ν•˜κΈ° μœ„ν•΄μ„œλŠ” BBAuth 에 맞좰 κ°œλ³„μ μœΌλ‘œ κ°œλ°œν•˜κ³  μœ μ§€λ³΄μˆ˜ ν•΄μ•Όν•œλ‹€.
  • OAuth의 λ“±μž₯

    졜초 1.0 버전은 2006λ…„ νŠΈμœ„ν„°μ™€ Ma.gnolia κ°€ μ£Όλ„μ μœΌλ‘œ κ°œλ°œν•˜μ˜€λ‹€. 이후 1.0버전이 κ°œμ„ λœ 1.0a 버전이 μΆœμ‹œλ˜μ—ˆμœΌλ‚˜ λͺ¨λ°”일 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ λ“±μ—μ„œ μ•ˆμ „ν•˜κ²Œ μ‚¬μš©λ  수 μ—†λŠ” 사둀가 μ‘΄μž¬ν–ˆλ‹€. 이런 사둀λ₯Ό λ³΄μ™„ν•˜κ³  κΈ°μ‘΄ 버전보닀 쑰금 더 λ‹¨μˆœν™”ν•œ OAuth 2.0 버전이 2012년에 λ“±μž₯ν•˜κ²Œ λ˜μ—ˆλ‹€.

OAuth 2.0의 주체

  • Resouce Owner

    λ¦¬μ†ŒμŠ€ μ†Œμœ μž. 우리의 μ„œλΉ„μŠ€λ₯Ό μ΄μš©ν•˜λ©΄μ„œ, ꡬ글, 페이슀뢁 λ“±μ˜ ν”Œλž«νΌμ—μ„œ λ¦¬μ†ŒμŠ€λ₯Ό μ†Œμœ ν•˜κ³  μžˆλŠ” μ‚¬μš©μžμ΄λ‹€. λ¦¬μ†ŒμŠ€λΌ ν•˜λ©΄ 'ꡬ글 μΊ˜λ¦°λ” 정보', '페이슀뢁 친ꡬ λͺ©λ‘', '넀이버 λΈ”λ‘œκ·Έ 포슀트 μž‘μ„±' 등이 해당될 것이닀.

  • Authorization & Resource Server

    Authorization ServerλŠ” Resource Ownerλ₯Ό μΈμ¦ν•˜κ³ , Clientμ—κ²Œ μ•‘μ„ΈμŠ€ 토큰을 λ°œκΈ‰ν•΄μ£ΌλŠ” μ„œλ²„μ΄λ‹€. Resource ServerλŠ” ꡬ글, 페이슀뢁, νŠΈμœ„ν„°μ™€ 같이 λ¦¬μ†ŒμŠ€λ₯Ό κ°€μ§€κ³  μžˆλŠ” μ„œλ²„λ₯Ό λ§ν•œλ‹€.
    Authorization Server와 Resource ServerλŠ” κ³΅μ‹λ¬Έμ„œμƒ λ³„κ°œλ‘œ κ΅¬λΆ„λ˜μ–΄ μžˆμ§€λ§Œ, λ³„κ°œμ˜ μ„œλ²„λ‘œ ꡬ성할지, ν•˜λ‚˜μ˜ μ„œλ²„λ‘œ κ΅¬μ„±ν• μ§€λŠ” κ°œλ°œμžκ°€ μ„ νƒν•˜κΈ° λ‚˜λ¦„μ΄λΌκ³  ν•œλ‹€.

  • Client

    Resource Server의 μžμ›μ„ μ΄μš©ν•˜κ³ μž ν•˜λŠ” μ„œλΉ„μŠ€. 보톡 μš°λ¦¬κ°€ κ°œλ°œν•˜λ €λŠ” μ„œλΉ„μŠ€κ°€ 될 것이닀.
    ClientλŠ” μš°λ¦¬κ°€ κ΅¬ν˜„ν•˜λŠ” μ„œλΉ„μŠ€μ΄λ―€λ‘œ Resource Owner와 ν—·κ°ˆλ¦¬μ§€ 말자. Resource Server와 Authorization Server의 μž…μž₯μ—μ„œλŠ” 우리 μ„œλΉ„μŠ€κ°€ ν΄λΌμ΄μ–ΈνŠΈμ΄κΈ° λ•Œλ¬Έμ— 이런 이름을 κ°–κ²Œ 된 것이닀.

OAuth 2.0의 λ™μž‘ λ©”μ»€λ‹ˆμ¦˜

πŸ’‘JWT

JWTλž€?

JWT(Json Web Token)은 μ›Ή ν‘œμ€€μ— λ”°λ₯Έ 데이터 전솑을 μœ„ν•œ κ°„κ²°ν•œ λ°©λ²•μœΌλ‘œ, 주둜 μ‚¬μš©μž 인증과 정보 κ΅ν™˜μ— μ‚¬μš©λ©λ‹ˆλ‹€. JWTλŠ” 헀더, νŽ˜μ΄λ‘œλ“œ, μ„œλͺ… μ„Έ λΆ€λΆ„μœΌλ‘œ κ΅¬μ„±λ˜μ–΄ 있으며 각 뢀뢄은 λ§ˆμΉ¨ν‘œλ‘œ κ΅¬λΆ„λ©λ‹ˆλ‹€.

  • Header(헀더): ν† ν°μ˜ νƒ€μž…κ³Ό ν•΄μ‹± μ•Œκ³ λ¦¬μ¦˜μ„ ν¬ν•¨ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, {"alg": "HS256", "typ": "JWT"} 같은 ν˜•νƒœλ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€.
{
  "alg": "HS256",
  "typ": "JWT"
}
  • Payload(νŽ˜μ΄λ‘œλ“œ): 토큰에 포함될 μ‹€μ œ 데이터가 λ“€μ–΄μžˆμŠ΅λ‹ˆλ‹€. 이 λ°μ΄ν„°λŠ” ν΄λ ˆμž„(claim)이라고도 ν•˜λ©°, μ‚¬μš©μž 정보, 만료 μ‹œκ°„, λ°œκΈ‰μž λ“± λ‹€μ–‘ν•œ 정보λ₯Ό 담을 수 μžˆμŠ΅λ‹ˆλ‹€. 이 뢀뢄은 Base64둜 μΈμ½”λ”©λ˜κΈ° λ•Œλ¬Έμ— λˆ„κ΅¬λ‚˜ λ””μ½”λ”©ν•  수 μžˆμ§€λ§Œ, λ””μ§€ν„Έ μ„œλͺ…을 톡해 μœ„μ‘° λ°©μ§€ κΈ°λŠ₯이 μΆ”κ°€λ©λ‹ˆλ‹€.
{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}
  • Signature(μ„œλͺ…): ν† ν°μ˜ 무결성을 ν™•μΈν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€. 헀더와 νŽ˜μ΄λ‘œλ“œλ₯Ό μ‘°ν•©ν•˜μ—¬ λΉ„λ°€ ν‚€λ₯Ό μ‚¬μš©ν•΄ ν•΄μ‹±ν•œ κ°’μž…λ‹ˆλ‹€. μ„œλͺ…을 톡해 토큰이 λ°œκΈ‰ 이후 λ³€κ²½λ˜μ§€ μ•Šμ•˜μŒμ„ 보μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    signatureλŠ” μ„œλ²„μ— μžˆλŠ” κ°œμΈν‚€λ‘œλ§Œ μ•”ν˜Έν™”λ₯Ό ν’€ 수 μžˆμœΌλ―€λ‘œ λ‹€λ₯Έ ν΄λΌμ΄μ–ΈνŠΈλŠ” μž„μ˜λ‘œ Signatureλ₯Ό λ³΅ν˜Έν™”ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  your-256-bit-secret
)

인증방식


1. Browser(μ‚¬μš©μž)κ°€ λ‘œκ·ΈμΈμ„ ν•œλ‹€.
2. μ„œλ²„λŠ” μ‚¬μš©μžκ°€ λ‘œκ·ΈμΈμ— μ„±κ³΅ν•˜λ©΄ User ID 등을 Secret Key둜 μƒμ„±ν•œλ‹€.
3. μ„œλ²„λŠ” λ§Œλ“€μ–΄μ§„ JWTλ₯Ό μ‚¬μš©μžμ—κ²Œ λ°˜ν™˜ν•œλ‹€.
4. μ‚¬μš©μžλŠ” 인가λ₯Ό ν•„μš”λ‘œ ν•˜λŠ” μš”μ²­ Authorization Header에 Token을 λ„£μ–΄ μš”μ²­ν•œλ‹€.
5. μ„œλ²„λŠ” Token을 기반으둜 μ‚¬μš©μžμ˜ 정보λ₯Ό κ°€μ Έμ˜¨λ‹€.
6. μ„œλ²„λŠ” Token으둜 κ°€μ Έμ˜¨ μ‚¬μš©μžμ˜ 정보λ₯Ό κΈ°λ°˜ν•˜μ—¬ 응닡을 ν•΄μ€€λ‹€.

Siganature은 μ–΄λ–»κ²Œ λ§Œλ“€μ–΄μ§€λ‚˜μš”?

1. 헀더와 νŽ˜μ΄λ‘œλ“œ 인코딩

  • JWT의 헀더와 νŽ˜μ΄λ‘œλ“œλ₯Ό 각각 Base64 URL μΈμ½”λ”©ν•©λ‹ˆλ‹€.

2. μ„œλͺ… 생성

  • μ„œλͺ…은 보톡 HMAC SHA256 μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•΄ μƒμ„±λ©λ‹ˆλ‹€.
  • μ„œλͺ…은 μΈμ½”λ”©λœ 헀더와 νŽ˜μ΄λ‘œλ“œλ₯Ό μ‘°ν•©ν•œ λ¬Έμžμ—΄μ„ λΉ„λ°€ 킀와 ν•¨κ»˜ ν•΄μ‹±ν•˜μ—¬ μƒμ„±ν•©λ‹ˆλ‹€.

μ„œλͺ… 과정은 λ‹€μŒκ³Ό 같이 ν‘œν˜„λ©λ‹ˆλ‹€.

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  your-256-bit-secret
)

3. μ„œλͺ… μΆ”κ°€

  • μƒμ„±λœ μ„œλͺ…은 JWT의 λ§ˆμ§€λ§‰ 뢀뢄에 μΆ”κ°€λ©λ‹ˆλ‹€.

4. μ„œλͺ… μ˜ˆμ‹œ

  • 헀더
{
  "alg": "HS256",
  "typ": "JWT"
}
  • νŽ˜μ΄λ‘œλ“œ
{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

1. Base64 URL μΈμ½”λ”©λœ 헀더

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

2. Base64 URL μΈμ½”λ”©λœ νŽ˜μ΄λ‘œλ“œ

eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9

3. μ„œλͺ…

  • λΉ„λ°€ ν‚€λ₯Ό "your-256-bit-secret"라고 κ°€μ •ν•  λ•Œ, μ„œλͺ…은 μ•„λž˜μ™€ 같이 μƒμ„±λ©λ‹ˆλ‹€.
HMACSHA256(
  "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9",
  "your-256-bit-secret"
)
  • μ„œλͺ…을 κ³„μ‚°ν•˜λ©΄ λ‹€μŒκ³Ό 같이 λ‚˜μ˜΅λ‹ˆλ‹€.
    SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
  • μ΅œμ’… JWTλŠ” λ‹€μŒκ³Ό 같이 κ΅¬μ„±λ©λ‹ˆλ‹€.
    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

이 JWTλ₯Ό μ„œλ²„λ‘œλΆ€ν„° λ°›λŠ” ν΄λΌμ΄μ–ΈνŠΈλŠ” μš”μ²­μ„ 보낼 λ•Œ 이 JWTλ₯Ό μ‚¬μš©ν•˜κ³ , μ„œλ²„λŠ” λΉ„λ°€ ν‚€λ₯Ό μ‚¬μš©ν•΄ μ„œλͺ…을 κ²€μ¦ν•˜μ—¬ 토큰이 λ³€μ‘°λ˜μ§€ μ•Šμ•˜λŠ”μ§€ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

Access Token이 νƒˆμ·¨λœλ‹€λ©΄?

Access Token은 λ°œκΈ‰λœ 이후, μ„œλ²„μ— μ €μž₯λ˜μ§€ μ•Šκ³  토큰 자체둜 검증을 ν•˜λ©° μ‚¬μš©μž κΆŒν•œμ„ μΈμ¦ν•˜κΈ° 떄문에, Access Token이 νƒˆμ·¨λ˜λ©΄ 토큰이 만료되기 μ „ κΉŒμ§€, 토큰을 νšλ“ν•œ μ‚¬λžŒμ€ λˆ„κ΅¬λ‚˜ κΆŒν•œ 접근이 κ°€λŠ₯ν•΄μ§„λ‹€. JWTλŠ” λ°œκΈ‰ν•œ ν›„ μ‚­μ œκ°€ λΆˆκ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ—, 접근에 κ΄€μ—¬ν•˜λŠ” 토큰에 μœ νš¨μ‹œκ°„μ„ λΆ€μ—¬ν•˜λŠ” μ‹μœΌλ‘œ νƒˆμ·¨ λ¬Έμ œμ— λŒ€ν•΄ λŒ€μ‘μ„ ν•˜μ—¬μ•Ό ν•œλ‹€.

1. Access Token의 만료 μ‹œκ°„ 짧게 μ„€μ •

  • μ•‘μ„ΈμŠ€ ν† ν°μ˜ 유효 기간을 짧게 μ„€μ •ν•˜λ©΄, νƒˆμ·¨λœ ν† ν°μ˜ μ‚¬μš© κ°€λŠ₯ 기간을 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 5λΆ„ λ˜λŠ” 10λΆ„κ³Ό 같은 짧은 만료 μ‹œκ°„μ„ μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 유효 기간이 짧은 λŒ€μ‹ , λ¦¬ν”„λ ˆμ‹œ 토큰을 μ‚¬μš©ν•˜μ—¬ 만료된 토큰을 κ°±μ‹ ν•˜λŠ” 방법을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

2. 토큰을 λ¬΄νš¨ν™”ν•˜λŠ” 방법

  • λΈ”λž™λ¦¬μŠ€νŠΈ : νŠΉμ • 토큰을 μ„œλ²„μ—μ„œ λΈ”λž™λ¦¬μŠ€νŠΈμ— μΆ”κ°€ν•˜μ—¬ ν•΄λ‹Ή 토큰을 λ¬΄νš¨ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ„œλ²„λŠ” λΈ”λž™λ¦¬μŠ€νŠΈλ₯Ό ν™•μΈν•˜μ—¬ νƒˆμ·¨λœ 토큰을 κ±°λΆ€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • Invalidation API : ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ λ‘œκ·Έμ•„μ›ƒ μ‹œλ‚˜, μ˜μ‹¬μŠ€λŸ¬μš΄ ν™œλ™μ΄ 발견된 경우 토큰을 λ¬΄νš¨ν™”ν•  수 μžˆλŠ” APIλ₯Ό μ œκ³΅ν•˜μ—¬ μ‚¬μš©μžκ°€ 직접 토큰을 폐기할 수 있게 ν•©λ‹ˆλ‹€.

Refesh Token이 νƒˆμ·¨λœλ‹€λ©΄?

  • Refresh Token Rotation(RTR)

    Refresh Token을 One time Use Only둜 μ„€μ •ν•œλ‹€. (ν•œλ²ˆ μ“°λ©΄ λ‹€μŒ refresh token을 λ°œκΈ‰)

  • ν•œλ²ˆ μ΄μƒμ˜ Refresh Token 의 μ‚¬μš©μ΄ κ°μ§€λ˜λ©΄, νƒˆμ·¨λœ κ²ƒμœΌλ‘œ κ°„μ£Όν•˜κ³  νƒˆμ·¨λœ κ²ƒμœΌλ‘œ κ°„μ£Ό 된 Refresh Token으둜 인해 λ°œκΈ‰λœ λͺ¨λ“  Refresh Token 듀을 νκΈ°ν•œλ‹€.

  • ν•˜μ§€λ§Œ 해컀가 μ§€μ†μ μœΌλ‘œ Access Token 만 νƒˆμ·¨ν•œλ‹€λ©΄, λ¬΄μš©μ§€λ¬Όμ΄ λœλ‹€.

πŸ’‘OAuth VS JWT

JWTλŠ” ν† ν°μ˜ μ’…λ₯˜μ΄κ³ , OAuthλŠ” 토큰을 λ°œκΈ‰ν•˜κ³  μΈμ¦ν•˜λŠ” μ˜€ν”ˆ μŠ€νƒ λ‹€λ“œ ν”„λ‘œν† μ½œμ΄λ‹€.

  • JWTλŠ” 헀더(Header), νŽ˜μ΄λ‘œλ“œ(Payload), μ„œλͺ…(Signature) μ„Έ λΆ€λΆ„μœΌλ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€. ν—€λ”μ—λŠ” 토큰 μœ ν˜•κ³Ό μ•”ν˜Έν™” μ•Œκ³ λ¦¬μ¦˜ 정보가 ν¬ν•¨λ˜μ–΄ 있으며, νŽ˜μ΄λ‘œλ“œμ—λŠ” ν΄λ ˆμž„(Claim) 정보가 ν¬ν•¨λ©λ‹ˆλ‹€. ν΄λ ˆμž„μ€ μ‚¬μš©μž, κΆŒν•œ, 유효 κΈ°κ°„ λ“±μ˜ 정보λ₯Ό 담을 수 μžˆμŠ΅λ‹ˆλ‹€. ν† ν°μ˜ μ„œλͺ…은 헀더, νŽ˜μ΄λ‘œλ“œ, λΉ„λ°€ ν‚€λ₯Ό μ‚¬μš©ν•˜μ—¬ μƒμ„±λ˜λ©°, μ„œλ²„λŠ” 이 μ„œλͺ…을 톡해 ν† ν°μ˜ μœ νš¨μ„±μ„ κ²€μ¦ν•©λ‹ˆλ‹€.

  • 반면, OAuth(Open Authorization)λŠ” μ‚¬μš©μžμ˜ 인증과 κΆŒν•œ λΆ€μ—¬λ₯Ό μœ„ν•œ ν”„λ‘œν† μ½œμž…λ‹ˆλ‹€. 주둜 μ‚¬μš©μžκ°€ λ‹€λ₯Έ μ›Ή μ‚¬μ΄νŠΈλ‚˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— λ‘œκ·ΈμΈν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€. OAuthλŠ” ν΄λΌμ΄μ–ΈνŠΈ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μžμ›μ— μ ‘κ·Όν•˜κΈ° μœ„ν•΄ μ‚¬μš©μžμ˜ λ™μ˜λ₯Ό μ–»κ³ , μ œν•œλœ μ•‘μ„ΈμŠ€ 토큰을 λ°œκΈ‰λ°›μ•„ μ‚¬μš©ν•©λ‹ˆλ‹€. 보톡 Bearer token을 λ°œκΈ‰ν•©λ‹ˆλ‹€.

  • μš”μ•½ν•˜μžλ©΄, JWTλŠ” ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ κ°„μ˜ 인증을 μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ 토큰이고, 토큰 μžμ²΄μ— 정보λ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€. 반면, OAuthλŠ” μ‚¬μš©μžμ˜ 인증과 κΆŒν•œ λΆ€μ—¬λ₯Ό μœ„ν•œ ν”„λ‘œν† μ½œλ‘œ, ν΄λΌμ΄μ–ΈνŠΈκ°€ μ‚¬μš©μžμ˜ λ™μ˜λ₯Ό μ–»μ–΄ μ œν•œλœ μ•‘μ„ΈμŠ€ 토큰을 λ°œκΈ‰λ°›μ•„ μžμ›μ— μ ‘κ·Όν•©λ‹ˆλ‹€.

좜처

https://velog.io/@qjqdn1568/%EC%9D%B8%EC%A6%9D%EA%B3%BC-%EC%9D%B8%EA%B0%80%EC%9D%98-%EC%B0%A8%EC%9D%B4-%EC%9E%90%EC%84%B8%ED%9E%88-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90
https://ittrue.tistory.com/246
https://hudi.blog/oauth-2.0/
https://cl8d.tistory.com/83
https://seungyong20.tistory.com/entry/JWT-Access-Token%EA%B3%BC-Refresh-Token-%EA%B7%B8%EB%A6%AC%EA%B3%A0-RTR-%EA%B8%B0%EB%B2%95%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90
https://velog.io/@chanyoung1998/JWT-%EC%99%80-OAuth-%EC%9D%98-%EC%B0%A8%EC%9D%B4

profile
CS 곡뢀λ₯Ό ν•΄λ΄…μ‹œλ‹€

0개의 λŒ“κΈ€