Gorilla-Kim/Project

[MEMO APP] Back-end/ Session&Token-Register (1)

Kim_gorilla 2020. 3. 19. 14:37

πŸ‘¨‍πŸ’» Session&Token (1)

μ§€λ‚œ ν¬μŠ€νŒ…μ— μ €ν¬λŠ” μ‹€μ œλ‘œ DB에 데이터듀이 μ €μž₯λ˜λŠ”κ²ƒκΉŒμ§€ κ΅¬ν˜„μ„ μ™„λ£Œν–ˆμŠ΅λ‹ˆλ‹€.

이제 νšŒμ›κ°€μž…μ‹œ νšŒμ›μ •λ³΄κ°€ μœ μ§€λ˜λ„λ‘ ν•˜λŠ” κΈ°λŠ₯을 κ΅¬ν˜„ν•΄ 보도둝 ν• κ»€λ°μš”, 이λ₯Ό μœ„ν•œ 토큰을 μƒμ„±ν•˜λŠ” μž‘μ—…μ„ λ¨Όμ € 이번 ν¬μŠ€νŒ…μ—μ„œ 닀뀄보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€. 

πŸ“Œ Web token

λ³΄μ•ˆ 및 인증을 μœ„ν•΄ μ‚¬μš©ν•˜λŠ” μΌμ’…μ˜ 열쇠같은 λ¬Έμžμ—΄λ©μ–΄λ¦¬ μž…λ‹ˆλ‹€.

주둜 μ˜λ―Έκ°€ μ—†λŠ” λ¬Έμžμ—΄(λžœλ€ν•œ λ¬Έμžμ—΄) 기반으둜 κ΅¬μ„±λ˜μ–΄μžˆκ³  νŠΉμ •ν•œ 정보λ₯Ό μ•”ν˜Έν™”ν•΄μ„œ λ¬Έμžμ—΄ν™”μ‹œμΌœ μ‚¬μš©μžμ—κ²Œ λ°œκΈ‰ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

 

그리고 μ‚¬μš©μžλŠ” 인증을 μœ„ν•΄μ„œ μ„œλ²„μ— ν•΄λ‹Ή 토큰을 듀고와 λ°˜λ‚©ν•˜κ³  이것을 μš°λ¦¬κ°€ μ½μ–΄μ„œ 인증된 μœ μ €μΈμ§€ μ‹λ³„ν•˜λŠ”κ²ƒμž…λ‹ˆλ‹€.

 

μš°λ¦¬λŠ” μ›Ήν† ν°μ€‘μ—μ„œλ„ ν΄λž˜μž„(Claim)기반 토큰을 μ‚¬μš©ν•˜κ² μŠ΅λ‹ˆλ‹€.

Claimν•œ ν† ν°μ΄λž€ 일반적인 ν† ν°μ—λŠ” λ‹¨μˆœν•œ λ¬Έμžμ—΄λ©μ–΄λ¦¬κΈ° λ•Œλ¬Έμ— νŠΉμ •ν•œ 정보λ₯Ό λ‹΄κΈ°κ°€ μ–΄λ ΅λ‹€λŠ” 단점이 μžˆμŠ΅λ‹ˆλ‹€.

 

ν•˜μ§€λ§Œ, μš°λ¦¬κ°€ μ‚¬μš©ν•  Claim기반 토큰은 정보λ₯Ό 담을 수 μžˆλŠ”λ° μ΄λ•Œ Claim은 μ‚¬μš©μž  μ •λ³΄λ‚˜ 데이터 속성등을 μ˜λ―Έν•©λ‹ˆλ‹€. 

 

직접 κ΅¬ν˜„ν•΄μ„œ μ‚¬μš©ν•˜κΈ°μ—λŠ” μ €μ˜ 내곡이 λΆ€μ‘±ν•¨μœΌλ‘œ 이미 잘 λ§Œλ“€μ–΄μ ΈμžˆλŠ” λͺ¨λ“ˆμ„ κ°€μ Έλ‹€κ°€ μ‚¬μš©ν•˜λ„λ‘ ν• ν…λ°μš”, μš°λ¦¬κ°€ μ‚¬μš©ν•  λͺ¨λ“ˆμ€ λ°”λ‘œ Json Web Token μž…λ‹ˆλ‹€.

 

그럼 우리의 ν”„λ‘œμ νŠΈμ— install ν•΄λ³΄λ„λ‘ν• κ²Œμš”.

( yarn add jsonwebtoken )

/* Json Web Token에 λŒ€ν•œ ꡬ체적인 μ„€λͺ…은 μ‘΄κ²½ν•˜λŠ” velopertλ‹˜μ˜ 글을 λ°œμ·Œν•΄μ™”μŠ΅λ‹ˆλ‹€. */

(https://velopert.com/2389)

 

Json Web Token은 총 3κ°€μ§€μ˜ 정보λ₯Ό 가지고 μžˆμŠ΅λ‹ˆλ‹€.

  1. Header (헀더)

  2. Payload (λ‚΄μš©)

  3. Signature (μ„œλͺ…)

HeaderλŠ” λ‘κ°€μ§€μ˜ 정보λ₯Ό 가지고 μžˆμŠ΅λ‹ˆλ‹€.

  • type : ν† ν°μ˜ νƒ€μž…μ„ μ§€μ •ν•©λ‹ˆλ‹€.

  • alg : ν•΄μ‹± μ•Œκ³ λ¦¬μ¦˜μ„ μ§€μ •ν•©λ‹ˆλ‹€.

PayloadλŠ” 토큰에 담을 λ‚΄μš©λ“€μ΄ ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 여기에 λ‹΄λŠ” μ •λ³΄μ˜ ν•œ 쑰각을 ν΄λ ˆμž„(Claim)이라고 λΆ€λ₯΄κ³ , μ΄λŠ” name/value ν•œμŒμ„ 가지고 μžˆμŠ΅λ‹ˆλ‹€. 그리고 볡수개의 ν΄λ ˆμž„μ„ 토큰에 λ‹΄λŠ”κ²ƒλ„ κ°€λŠ₯ν•©λ‹ˆλ‹€.

 

그리고 이 ν΄λ ˆμž„μ˜ μ’…λ₯˜λŠ” 총 3가지가 있으며 각각 μ•„λž˜μ™€κ°™μ΄ κ΅¬λΆ„λ˜μ–΄ μ§‘λ‹ˆλ‹€.

  • (λ“±λ‘λœ) registered claim
  • (곡개)    public claim
  • (λΉ„κ³΅κ°œ) private claim

이쀑에 registered claim은 μ„œλΉ„μŠ€μ— ν•„μš”ν•œ 정보듀이 μ•„λ‹Œ, 토큰에 λŒ€ν•œ 정보듀을 λ‹΄κΈ°μœ„ν•˜μ—¬ 이름이 이미 정해진 ν΄λ ˆμž„λ“€μž…λ‹ˆλ‹€.

 

이 ν΄λ ˆμž„μ— ν¬ν•¨λœ ν΄λ ˆμž„λ“€μ˜ 이름듀은 μ•„λž˜μ™€ 같이 μžˆμŠ΅λ‹ˆλ‹€.

  • iss
    : 토큰 λ°œκΈ‰μž
  • sub
    : 토큰 제λͺ©
  • aud
    : 토큰 λŒ€μƒμž
  • exp
    : ν† ν°μ˜ λ§Œλ£Œμ‹œκ°„ (ν˜„μž¬μ‹œκ°„ μ΄ν›„λ‘œ μ„€μ •λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.)
  • nbf
    : Not Beforeλ₯Ό μ˜λ―Έν•˜λ©° ν† ν°μ˜ ν™œμ„±λ‚ μžμ™€ λΉ„μŠ·ν•œ μ—­ν• μ„ν•˜λ©° ν•΄λ‹Ή λ‚ μ§œκ°€ μ§€λ‚˜κ°€κΈ° μ „κΉŒμ§€λŠ” 토큰이 μ²˜λ¦¬λ˜μ–΄μ§€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • iat
    : 토큰이 λ°œκΈ‰λœ μ‹œκ°„
  • jti
    : JWTν† ν°μ˜ 고유 μ‹λ³„μž (주둜 쀑볡적인 처리λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•¨)

Public claim은 좩돌이 λ°©μ§€λœ 이름을 가지고 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. μΆ©λŒμ„ λ°©μ§€ν•˜κΈ° μœ„ν•΄μ„œλŠ”, ν΄λ ˆμž„ 이름을 URIν˜•μ‹μœΌλ‘œ μ§“μŠ΅λ‹ˆλ‹€.

{
    "https://localhost.com/4000/jwt_claims/is_admin": true
}

Private claim은 λ“±λ‘λœ ν΄λž˜μž„λ„ 곡개 ν΄λž˜μž„λ„ μ•„λ‹ˆκ³  μ–‘μΈ‘(μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈ)간에 ν˜‘μ˜ν•˜μ— μ‚¬μš©ν•˜λŠ” ν΄λ ˆμž„ μ΄λ¦„μž…λ‹ˆλ‹€.

 

Example ( velopert λΈ”λ‘œκ·Έ μ˜ˆμ‹œλ‚΄μš© 발췌 )

{
    "iss": "gorillaKim.com",
    "exp": "1485270000000",
    "https://gorillaKim.com/jwt_claims/is_admin": true,
    "userId": "11028373727107",
    "username": "gorillaKim"
}

SignatureλŠ” ν—€λ”μ˜ 인코딩값과, μ •λ³΄μ˜ 인코딩값을 ν•©μΉœν›„ 주어진 λΉ„λ°€ν‚€λ‘œ ν•΄μ‰¬ν•˜μ—¬ μƒμ„±ν•©λ‹ˆλ‹€.

 

μœ„μ˜ λ‚΄μš©μ„ ν† λŒ€λ‘œ μš°λ¦¬κ°€ μ‚¬μš©ν•  토큰 μƒμ„±ν•¨μˆ˜μ™€ κ·Έ 토큰을 ν•΄λ…μ‹œμΌœμ£ΌλŠ” ν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄ 보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

token.js νŒŒμΌμ„ λ§Œλ“€κ»€λ° μ΄λ ‡κ²Œ 보쑰둜 λ„μ™€μ£ΌλŠ” νŒŒμΌλ“€μ„ src ν΄λ”μ•ˆμ— libλΌλŠ” 폴더λ₯Ό λ§Œλ“€μ–΄μ„œ λ”°λ‘œ κ΄€λ¦¬ν•˜λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

λ‹€μŒμ˜ 그림처럼 폴더와 νŒŒμΌμ„ κ΅¬μ„±ν•΄μ£Όμ„Έμš”.

 

그리고 token.js에 λ‘κ°œμ˜ ν•¨μˆ˜λ₯Ό λ§ˆμ € μž‘μ„±ν•΄λ³΄λ„λ‘ ν• κ²Œμš”.

 

처음으둜 토큰 μƒμ„±ν•¨μˆ˜μž…λ‹ˆλ‹€.

  • payloadλŠ” μ™ΈλΆ€μ—μ„œ μƒμ„±ν•˜μ—¬ λ°›μ•„ jsonwebtoken으둜 λ„˜κ²¨μ€λ‹ˆλ‹€. 
  • 그리고 secret은 μš°λ¦¬κ°€ λ§Œλ“€ 토큰을 해쉬화 ν•˜κΈ°μœ„ν•΄ μ‚¬μš©ν•˜λŠ” salt라 λΆˆλ¦¬λŠ” μΌμ’…μ˜ λ¬Έμžμ—΄μž…λ‹ˆλ‹€.

μ—¬κΈ°μ„œ secret값은 λ³΄μ•ˆμƒμ˜ 이유둜 μ†ŒμŠ€μ½”λ“œμƒμ—μ„œ κ°μΆ°μ£ΌλŠ”κ²ƒμ΄ μ’‹μŒμœΌλ‘œ .env νŒŒμΌμ— λ§Œλ“€μ–΄μ„œ λΆˆλŸ¬μ™€ μ‚¬μš©ν•΄μ€λ‹ˆλ‹€.

그리고 토큰을 μƒμ„±ν–ˆμœΌλ‹ˆ 이 토큰을 ν•΄λ…ν•΄μ£ΌλŠ” decodeν•¨μˆ˜λ„ λ§Œλ“€μ–΄μ£Όκ² μŠ΅λ‹ˆλ‹€.

그리고 λ§ˆμ§€λ§‰μœΌλ‘œ 두 ν•¨μˆ˜λ₯Ό μ™ΈλΆ€λ‘œ λ³΄λ‚΄μ£ΌλŠ” exportμž‘μ—…λ„ ν•΄μ£Όκ² μŠ΅λ‹ˆλ‹€.

 

μ—¬κΈ°κΉŒμ§€ μ˜€λŠ˜μ€ 토큰을 μ½κ³ ν•΄μ„ν•˜λŠ” ν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄ λ³΄μ•˜μŠ΅λ‹ˆλ‹€. λ‹€μŒ ν¬μŠ€νŒ…μ—μ„œλŠ” 이 ν† ν°ν•¨μˆ˜λ“€μ„ ν™œμš©ν•΄μ„œ νšŒμ›κ°€μž… 절차 μ„±κ³΅μ‹œ 토큰을 λ°œκΈ‰ν•˜λŠ” 뢀뢄을 μ™„μ„±μ‹œμΌœμ£Όλ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.