λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
🌌 | WEB DEV/WEB

[WEB] 토큰 (Token)

by KASSID 2023. 5. 4.

λͺ©μ°¨

    728x90

    1. 인증(Authentication)κ³Ό 인가(Authorization)

    인증과 μΈκ°€λŠ” μ–Έλœ» λΉ„μŠ·ν•˜μ§€λ§Œ λͺ…ν™•νžˆ λ‹€λ₯Έ 단어이닀.

     

    인증은 '둜그인' κ·Έ 자체이라고 μƒκ°ν•˜λ©΄ λœλ‹€.

    즉, μ‚¬μ΄νŠΈμ— νŠΉμ • κΆŒν•œμ„ 가진 μ‚¬μš©μžμž„μ„ 고유 ID, pw 등을 ν†΅ν•΄μ„œ 인증을 λ°›λŠ” 것이닀.

     

    μΈκ°€λŠ” 둜그인이 'μœ μ§€λ˜λŠ” μƒνƒœμ—μ„œ μΌμ–΄λ‚˜λŠ” 일'이닀.

    인증을 받은 μ‚¬μš©μžκ°€ μ‚¬μ΄νŠΈ λ‚΄μ—μ„œ 'μžμ‹ μ˜ κ³„μ •μœΌλ‘œλ§Œ' ν•  수 μžˆλŠ” ν™œλ™μ„ ν•  λ•Œ μ‚¬μ΄νŠΈμ—μ„œ ν—ˆκ°€ν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€.

     

    μ‚¬μš©μžκ°€ 자기 계정을 μ‚¬μš©ν•˜λ €ν•  λ•Œ μ–΄μ„Όν‹±μΌ€μ΄μŽ€!!
    응 μ–΄μ„œμ™€λΌμ΄μ œμ΄μ…˜~  -μ–„μ½”μŒ€

     

     


    2. JWT(JSON Web Token)

    1) μ„œλ²„μ—μ„œ μ•Œμ•„μ•Όν•˜λŠ” 것은?

    JWTλŠ” 인가에 κ΄€λ ¨λœ κΈ°μˆ μ΄λ‹€.

    μ–΄λ–€ μ‚¬μ΄νŠΈλ₯Ό μ‚¬μš©μžκ°€ μ΄μš©ν•  λ•Œμ—λŠ” 'ν•΄λ‹Ή μœ μ €κ°€ λ‘œκ·ΈμΈν•œ μƒνƒœμΈμ§€ μ•„λ‹Œμ§€' λ₯Ό μ„œλ²„κ°€ μ•Œ 수 μžˆλŠ” 방법이 ν•„μš”ν•˜λ‹€.

     

    λ¨Όμ €, μ‚¬μ΄νŠΈ λ‚΄ μ„œλΉ„μŠ€λ₯Ό μ‚¬μš©μžλ“€μ΄ μ΄μš©ν•  λ•ŒλŠ” λͺ¨λ“  것이 λ‹€ μš”μ²­μ΄λ‹€. 그리고 μ‚¬μ΄νŠΈλŠ” κ·Έ μš”μ²­μ— λŒ€ν•œ 응닡을 ν•œλ‹€.

    μ΄λ•Œ μ„œλ²„λŠ” μš”μ²­λ§ˆλ‹€ 둜그인 μ—¬λΆ€λ₯Ό ν™•μΈν•œ ν›„, νŠΉμ • μ„œλΉ„μŠ€μ˜ μ œκ³΅μ„ ν—ˆμš©ν•  지 μ•ˆ 할지λ₯Ό κ²°μ •ν•œλ‹€.

     

    맀 μš”μ²­λ§ˆλ‹€ μ„œλ²„μ— μœ μ € 아이디, λΉ„λ²ˆ 정보 자체λ₯Ό μ „μ†‘ν•˜κΈ°μ—λŠ” 둜그인 μž‘μ—…μ΄ λ„ˆλ¬΄ 무거운 μž‘μ—…μ΄λ‹€.

    (DB에 μ €μž₯된 아이디 계정과 λΉ„λ°€λ²ˆν˜Έλ₯Ό μ²˜λ¦¬ν•œ 값이 μž…λ ₯κ°’κ³Ό μΌμΉ˜ν•˜λŠ”κ°€? λ“±μ˜ 처리)

    λ˜ν•œ λ³΄μ•ˆ μƒμ˜ μš°λ €λ„ μ‘΄μž¬ν•œλ‹€.

     

    2) μ„Έμ…˜

    인가λ₯Ό μ²˜λ¦¬ν•˜λŠ” 방식 쀑 μ„Έμ…˜μ„ ν™œμš©ν•˜λŠ” 방법은 'μ„Έμ…˜ ν‘œλ”±μ§€'λ₯Ό μœ μ €μ™€ μ„œλ²„κ°€ μ„œλ‘œ λ‚˜λˆ„μ–΄ 가지며

    μš”μ²­μ΄ μ„œλ²„μ— 듀어왔을 λ•Œ 이λ₯Ό μ΄μš©ν•˜μ—¬ 인가λ₯Ό ν™•μΈν•œλ‹€.

     

    κ·ΈλŸ¬λ‚˜ 이 방식은 μ‚¬μš©μž μˆ˜μ— λ”°λ₯Έ μš©λŸ‰ λΆ€μ‘±κ³Ό μ„œλ²„ μž¬λΆ€νŒ… μ‹œ μ €μž₯된 μžλ£Œκ°€ μ¦λ°œν•˜λŠ” λ¬Έμ œκ°€ μžˆλ‹€.

    그에 따라 λͺ¨λ“  μ‚¬μš©μž 둜그인이 νŠ•κΈ°λŠ” κ²½μš°κ°€ λ°œμƒν•˜κΈ°λ„ ν•œλ‹€.

     

    더 λ¬Έμ œλŠ” μ„œλΉ„μŠ€μ˜ 규λͺ¨κ°€ μ»€μ„œ μ„œλ²„ Com을 μ—¬λŸ¬ λŒ€ 두고 μš΄μ˜ν•  λ•ŒμΈλ°

    각 Comκ°„μ˜ 정보 곡유 문제둜 μ„Έμ…˜ μœ μ§€κ°€ μ–΄λ ΅λ‹€λŠ” λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλ‹€.

     

    λ§Œμ•½ λ©”λͺ¨λ¦¬κ°€ μ•„λ‹Œ μ„œλ²„, DB 등에 μ €μž₯ν•  κ²½μš°μ—λŠ” 속도 μ €ν•˜μ˜ λ¬Έμ œκ°€ μžˆλ‹€.

     

    μ •λ¦¬ν•˜λ©΄ μ„Έμ…˜μ€ μ„œλ²„κ°€ λ³΅μž‘ν•œ ꡬ성과 ν™˜κ²½μ—μ„œ μ–΄λ–€ μƒνƒœλ₯Ό κΈ°μ–΅ν•΄μ•Όν•œλ‹€λŠ” μ˜€λ²„ν—€λ“œκ°€ λ°œμƒν•œλ‹€.

     

    3) JWT의 λ“±μž₯

    JWTλŠ” μ„Έμ…˜μ˜ 단점을 κ·Ήλ³΅ν•˜κ³  '인가'λ₯Ό μ²˜λ¦¬ν•˜κΈ°μœ„ν•΄ κ³ μ•ˆλœ '토큰 방식'이닀.

    이λ₯Ό μ‚¬μš©ν•˜λŠ” μ„œλΉ„μŠ€μ—λŠ” μ‚¬μš©μžκ°€ λ‘œκ·ΈμΈμ„ ν•˜λ©΄ 토큰을 좜λ ₯ν•΄μ„œ μ „λ‹¬ν•œλ‹€.

     

    μ„Έμ…˜μ΄ μ„œλ²„κ°€ λ°˜μ„ κ°–κ³  λ‚˜λ¨Έμ§€ λ°˜μ„ μ£Όμ—ˆλ‹€λ©΄

    JWTλŠ” μ‚¬μš©μžμ—κ²Œ μ˜¨μ „νžˆ μ „λ‹¬ν•œλ‹€. 이것이 μ„Έμ…˜κ³Ό λ‹€λ₯Έμ μ΄λ‹€.

     

    μ½”λ“œμ˜ ν˜•νƒœλŠ” 인코딩 ν˜Ήμ€ μ•”ν˜Έν™”λœ 3가지 데이터λ₯Ό 이어뢙인 것이닀.

    ex) eyJhbGciOiJIUzI.eyJzdWIiOyfQ.SflKxwReJf366yJV_adQssw5c (μž„μ˜ μ˜ˆμ‹œ) 
    https://jwt.io/

     

    JWT ꡬ성

    μœ„μ˜ μ˜ˆμ‹œλ₯Ό 보면 ' . ' λ‘κ°œλ‘œ 3λΆ€λΆ„μœΌλ‘œ λ‚˜λ‰œ 것을 μ•Œ 수 μžˆλ‹€.

    각각의 이름은 header(헀더), payload(νŽ˜μ΄λ‘œλ“œ), verify signature(μ„œλͺ…) 이닀.

     

    β‘ 

    payloadλŠ” μ‚¬μš©μž 정보 λ“±μ˜ 데이터인 Claim을 λ‹΄λŠ”λ‹€.(λˆ„κ°€ λˆ„κ΅¬μ—κ²Œ 제곡, μœ νš¨κΈ°κ°„, λ‹‰λ„€μž„, κ΄€λ¦¬μž μ—¬λΆ€ λ“± μ„œλΉ„μŠ€κ°€ λ‹΄κ³  싢은 것듀)

    즉, μ‚¬μš©μžκ°€ λ‘œκ·ΈμΈμ„ ν•˜κ³  λ°›λŠ” 토큰 내에 Claim이 담겨 있고

    μ‚¬μš©μžκ°€ μš”μ²­μ„ 보낼 λ•Œλ§ˆλ‹€ μ„œλ²„λ‘œ 토큰을 λ³΄λ‚΄λ©΄μ„œ μ΄λ²ˆμ—λŠ” μ‚¬μš©μžμ—μ„œ μ„œλ²„λ‘œ 데이터가 μ „λ‹¬λ˜λŠ” 것이닀.

     

    μ΄λŸ¬ν•œ 방식은 토큰 μžμ²΄μ— ν•„μš”ν•  정보듀이 λ“€μ–΄μžˆκΈ° λ•Œλ¬Έμ— DB λ‚΄μ—μ„œ 정보 검색 μ‹œκ°„μ΄ 쀄어든닀.

     

    β‘‘

    κ·Έλ ‡λ‹€λ©΄ 이 μ •λ³΄μ˜ μ•”ν˜Έν™”λŠ” μ–΄λ–»κ²Œ μ§„ν–‰ν• κΉŒ?

     

    λ¨Όμ € headerλŠ” typeκ³Ό alg으둜 μ΄λ£¨μ–΄μ§€λŠ”λ°

    type은 jwt둜 고정이고 algλŠ” verify signature의 κ°’μœΌλ‘œ μ‚¬μš©λ  μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€. HS256 λ“± μ—¬λŸ¬ μ•”ν˜Έν™” 방식 쀑 ν•˜λ‚˜λ₯Ό μ§€μ •ν•œλ‹€.

     

    헀더와 νŽ˜μ΄λ‘œλ“œ, μ„œλ²„μ— λ‚΄μž₯된 μ•”ν˜Έν‚€λ₯Ό μ•Œκ³ λ¦¬μ¦˜μ— λ„£μ–΄μ„œ λ‚˜μ˜¨ 값이 λ°”λ‘œ verify signature값이닀.

    μ™ΈλΆ€μ‚¬μš©μžλŠ” μ„œλ²„μ— λ‚΄μž₯된 μ•”ν˜Έν‚€λ₯Ό μ•Œμ§€ λͺ»ν•œλ‹€λ©΄ 토큰을 ν†΅ν•΄μ„œλŠ” 정보듀을 μ‘°μž‘ν•  수 μ—†λ‹€.

     

    μ„œλ²„λŠ” μ‚¬μš©μžμ˜ μš”μ²­μ— λ‹΄κΈ΄ ν† ν°μ˜ header와 payload 값을 μ„œλ²„μ˜ λΉ„λ°€ 킀와 ν•¨κ»˜ μ•Œκ³ λ¦¬μ¦˜μ„ 돌리고

    λ°˜ν™˜λœ 값이 verify signatureκ°’κ³Ό μΌμΉ˜ν•˜λŠ”μ§€λ₯Ό κ²€ν† ν•œλ‹€.

     

    λ§Œμ•½ μΌμΉ˜ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ 접근을 κ±°λΆ€ν•˜κ³ 

    μΌμΉ˜ν•˜κ³  μœ νš¨κΈ°κ°„κΉŒμ§€ λ¬Έμ œμ—†λ‹€λ©΄ 둜그인된 μœ μ €λ‘œ 인가λ₯Ό λ‚΄μ€€λ‹€.

     

     

    4) μ„Έμ…˜κ³Ό JWT의 단점

    JWTκ°€ μ„Έμ…˜μ„ μ™„λ²½ν•˜κ²Œ λŒ€μ²΄ν•  수 μžˆλŠ” 것은 μ•„λ‹ˆλ‹€!

    μ„Έμ…˜μ€ statefulν•˜κ³ , JWTλŠ” statelessν•˜λ‹€. 즉, 동적이고 정적이닀.

     

    μ„Έμ…˜μ˜ 경우 λͺ¨λ“  μ‚¬μš©μžλ“€μ˜ μƒνƒœλ₯Ό κΈ°μ–΅ν•΄μ•Όν•œλ‹€λŠ” 것이 λ‹¨μ μ΄μ§€λ§Œ

    이것이 해결이 될 경우 κΈ°μ–΅ν•΄μ•Όν•  λŒ€μƒμ˜ μƒνƒœλ₯Ό μ–Έμ œλ“  μ œμ–΄ν•  수 μžˆλ‹€.(λ¬΄νš¨ν™” 등이 κ°€λŠ₯함)

     

    이에 λŒ€ν•œ μ˜ˆμ‹œλ‘œ λ§Œμ•½ λ‘œκ·ΈμΈν•  κΈ°κΈ°κ°€ ν•œ λŒ€λ§Œ μœ μ§€λ˜λ„λ‘ ν•˜κΈ°μœ„ν•΄μ„œ

    μ„Έμ…˜ 방식을 ν™œμš©ν•  경우 μƒˆλ‘œμš΄ κΈ°κΈ°κ°€ λ‘œκ·ΈμΈμ„ μ‹œλ„ν•  λ•Œ 둜그인된 κΈ°κΈ°λŠ” λ‘œκ·Έμ•„μ›ƒμ΄ λ˜λ„λ‘

    κΈ°μ‘΄ μ„Έμ…˜μ„ μ’…λ£Œν•˜λ©΄ λœλ‹€.

     

    λ°˜λŒ€λ‘œ ν† ν°μ˜ κ²½μš°μ—λŠ” ν•œ 번 λ°œκΈ‰μ΄ λœλ‹€λ©΄ μ„œλ²„μ—μ„œλŠ” λŒ€μƒμ˜ 정보λ₯Ό 가지고 μžˆμ§€ μ•ŠκΈ° λ•Œλ¬Έμ—

    ν†΅μ œν•˜λŠ” 것이 μ–΄λ ΅λ‹€. 심지어 이λ₯Ό μ•…μš©ν•˜μ—¬ 토큰을 μ•…μ„± μœ μ €κ°€ ν™œμš©ν•  경우 이λ₯Ό μ œμ§€ν•  수 μžˆλŠ” 방법이 μ—†λ‹€.

     

    λ”°λΌμ„œ λ§Žμ€ μ„œλΉ„μŠ€λ“€μ΄ JWT와 μ„Έμ…˜μ„ 적절히 λΆ„λ°°ν•˜μ—¬ μ‚¬μ΄νŠΈλ₯Ό λ§Œλ“ λ‹€.

     

     

    5) ν† ν°μ˜ 단점을 λ³΄μ™„ν•˜λŠ” 방법

    μ΄λŸ¬ν•œ ν† ν°μ˜ 단점을 λ³΄μ™„ν•˜κΈ° μœ„ν•΄μ„œ κ³ μ•ˆν•œ 방법 쀑 ν•˜λ‚˜λŠ” 둜그인 μ‹œ 2개의 토큰을 λΆ€μ—¬ν•˜λŠ” 것이닀.

    수λͺ…이 λͺ‡ μ‹œκ°„ ν˜Ήμ€ λͺ‡ λΆ„ μ΄ν•˜λ‘œ 짧은 access 토큰과

    보톡 2μ£Ό μ •λ„μ˜ κΈ΄ 수λͺ…을 κ°€μ§€λŠ” refresh 토큰이닀.

     

    이 방식을 κ΅¬ν˜„ν•˜λŠ” 방식 쀑 ν•˜λ‚˜λŠ”

    두 토큰을 λ°œκΈ‰ν•˜κ³  ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 보내고 λ‚˜μ„œ refresh ν† ν°μ˜ 상응값을 DB에도 μ €μž₯ν•œλ‹€.

     

    μ‚¬μš©μžλŠ” access ν† ν°μ˜ 수λͺ…이 λ‹€ν•˜λ©΄ refresh 토큰을 λ³΄λ‚΄λŠ”λ°

    μ„œλ²„κ°€ DB에 μ €μž₯된 κ°’κ³Ό 비ꡐ해보고 λ§žλ‹€λ©΄ μƒˆλ‘œμš΄ access 토큰을 λ°œκΈ‰ν•΄μ£ΌλŠ” 것이닀.

    refresh 토큰이 μ•ˆμ „ν•˜κ²Œ κ΄€λ¦¬λœλ‹€λ©΄ μ΄κ²ƒμ˜ μœ νš¨κΈ°κ°„ λ™μ•ˆμ€ λ‘œκ·ΈμΈμ„ μƒˆλ‘œν•˜μ§€ μ•Šκ³ λ„ access 토큰을 λ°œκΈ‰λ°›μ„ 수 μžˆλŠ” 것이닀.

     

    이 방식은 access 토큰이 λˆ„κ΅°κ°€μ—κ²Œ νƒˆμ·¨λ˜μ–΄λ„ 그것이 금방 λ¬΄μš©μ§€λ¬Όμ΄ 되고

    κ°•μ œ λ‘œκ·Έμ•„μ›ƒμ„ μ‹œν‚€κΈ° μœ„ν•΄μ„œ refresh토큰을 dbμ—μ„œ μ‚­μ œν•˜μ—¬ access토큰 갱신이 더이상 λΆˆκ°€ν•˜λ„λ‘ ν•˜λ©΄ λœλ‹€.

     

    λ¬Όλ‘  짧은 μ‹œκ°„ access 토큰이 μœ μ§€λ˜λŠ” λ™μ•ˆ 이λ₯Ό 막을 수 μžˆλŠ” 방법은 μ—†λ‹€. κ·ΈλŸ¬λ‚˜ 토큰 ν•˜λ‚˜λ‘œ μš΄μ˜ν•˜λŠ” 것보닀 μ’‹μŒ

     

     

     

     

     

     

     

     

     

    λŒ“κΈ€