λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μ‹œλ„/Code-States

[D+132] Final Project : 12일차 JWT(JSON Web Token) ν•™μŠ΅

by πŸ‡λ°•λ΄‰λ΄‰πŸ‡ 2021. 2. 28.

 

 

D+132

-  Final Project : 12일차 -

( multer, social login, jwt ν•™μŠ΅ )

 


 

 

μ˜€λŠ˜μ€ 내일뢀터 본격적으둜 μ§„ν–‰ν•˜κ²Œ 될

μ†Œμ…œλ‘œκ·ΈμΈκ³Ό multer, 그리고 토큰에 λŒ€ν•΄μ„œ κ°„λ‹¨ν•˜κ²Œ ν•™μŠ΅μ„ ν•˜λŠ” μ‹œκ°„μ„ κ°€μ‘Œλ‹€.

 

μ†Œμ…œλ‘œκ·ΈμΈμ€ First ν”„λ‘œμ νŠΈ λ•Œ κΉƒν—ˆλΈŒλ₯Ό κ΅¬ν˜„ν•΄ λ³΄μ•˜κΈ°λ„ ν–ˆκ³ ,

같이 μ§„ν–‰ν•˜λŠ” νŽ˜μ–΄λΆ„κ»˜μ„œ First ν”„λ‘œμ νŠΈλ•Œ μ†Œμ…œλ‘œκ·ΈμΈνŒŒνŠΈλ‘œ 카카였λ₯Ό 이미 진행해 보셨닀고 ν•˜μ…”μ„œ

큰 걱정은 μ—†μ§€λ§Œ...(?)

이미지λ₯Ό μ—…λ‘œλ“œν•˜λŠ” multer와 μΈμ¦μ‹œ μ‚¬μš©ν•˜λŠ” JWT토큰에 λŒ€ν•΄μ„œλŠ”

혼자 μ œλŒ€λ‘œ ν•΄λ³Έ 적이 μ—†μ–΄μ„œ μ•½κ°„ κΈ΄μž₯μƒνƒœλ‹€.

 

multerλŠ” λ‹¨μˆœνžˆ λ‚΄κ°€ λ§Œλ“  μ„œλ²„μ—μ„œ μ§€μ •ν•œ 폴더에 이미지λ₯Ό μ—…λ‘œλ“œν•˜λŠ” 방법도 μžˆμ§€λ§Œ

이 방법은 μ„œλ²„κ°€ λ¬΄κ±°μ›Œμ§€λ©΄μ„œ 뢀담을 κ°€μ§€κ²Œ 되기 λ•Œλ¬Έμ—

보톡 λ°°ν¬μ‹œμ— λ§Œλ“œλŠ” S3 λ²„ν‚·μ—μ„œ μ €μž₯될 수 μžˆλ„λ‘ κ΅¬ν˜„ν•œλ‹€κ³  ν•˜λŠ”λ°

λ‚œμƒ 처음 λ“€μ–΄λ³΄λŠ”κ±°λΌ μ™„μ „ μ œλ‘œλ² μ΄μŠ€λΌμ„œ μ•½κ°„ 걱정이 λ˜λŠ”κ²ƒ κ°™λ‹€.

 

그리고 JWTλŠ” 이전에 μˆ˜μ—…μ—μ„œλ„ λ°°μš°κΈ°λ„ ν–ˆκ³ , First ν”„λ‘œμ νŠΈμ—μ„œλ„ μ‚¬μš©ν•΄ λ³Έ 적이 μžˆμ§€λ§Œ

μˆ˜μ—…μ—μ„œλŠ” κ°œλ…μ„ μœ„μ£Όλ‘œ μ΄ν•΄ν•˜λ €κ³  ν•˜λ‹€λ³΄λ‹ˆ μ‹€μŠ΅μ„ μ œλŒ€λ‘œ μ΄ν•΄ν•˜μ§€ λͺ»ν•œ 채 λ„˜μ–΄κ°”μ—ˆκ³ ,

ν”„λ‘œμ νŠΈλ•Œμ—λŠ” νŒ€μž₯λ‹˜μ΄ μΈμ¦κ΅¬ν˜„μ„ λ§‘μœΌμ‹œκ³  λ‚˜λŠ” 거의 κ΄€λžŒκ° μˆ˜μ€€μ΄μ—ˆμ–΄μ„œ 많이 λ―Έμˆ™ν•˜λ‹€.

 

κ³Όμ—° λ¬΄νƒˆν•˜κ²Œ 잘 ν•  수 μžˆμ„μ§€ 걱정이 λ˜μ§€λ§Œ.... 미래의 λ‚˜μ•Ό μž˜ν•΄μ€˜...πŸ˜…πŸ˜…πŸ˜…

 

 


⚠️ multer와 social login은 λ”°λ‘œ μž‘μ„±ν•΄ λ³Ό μ˜ˆμ • μž…λ‹ˆλ‹€ ⚠️

 

 

JWT (jsonwebtoken)

 

μ„Έμ…˜(session) 원리

JWTλ₯Ό μ•ŒκΈ°μ „μ— session이 μ–΄λ–€ μ›λ¦¬λ‘œ μž‘λ™ν•˜λŠ” 지에 λŒ€ν•΄ 잠깐 μ‚΄νŽ΄λ³΄μžλ©΄,

 

β‘  λ¨Όμ € νšŒμ›μ΄ λ‘œκ·ΈμΈμ„ μ‹œλ„ν•œλ‹€.

 

β‘‘ μœ μ €κ°€ μ„œλ²„λ‘œ λΆ€ν„° λ‘œκ·ΈμΈμ„ μš”μ²­ν•˜λ©΄ μ„œλ²„λŠ” κ·Έ μˆœκ°„ μ„Έμ…˜μ„ μƒμ„±ν•˜κ³  μœ μ €μ—κ²Œ sessionIDλ₯Ό λΆ€μ—¬ν•œλ‹€.

 

β‘’ 이 이후뢀터 μœ μ €λŠ” λ‘œκ·ΈμΈμ„ ν•œ νšŒμ›λ§Œ μ ‘κ·Ό ν•  수 μžˆλŠ” μš”μ²­μ„ ν•  κ²½μš°μ—,

μ„œλ²„μ—κ²Œ λ‘œκ·ΈμΈμš”μ²­μ„ ν–ˆμ„ λ•Œ λ°›μ•˜λ˜ sessionIDλ₯Ό μš”μ²­κ³Ό ν•¨κ»˜ λ³΄λ‚΄μ€€κ²Œ λœλ‹€.

 

β‘£μ΄λ•Œ μ„œλ²„λŠ” μœ μ €μ—κ²Œ 받은 sessionIDλ₯Ό ν†΅ν•΄μ„œ 우리 νšŒμ›μ΄ λ§žλŠ”μ§€ ν™•μΈν•˜κ³ ,

μΌμΉ˜ν•  경우 μš”μ²­μ— λ”°λ₯Έ 응닡을 λ³΄λ‚΄μ£Όκ²Œ λœλ‹€.

 

이런 μ›λ¦¬λ‘œ μž‘λ™ν•˜κ²Œ λ˜λŠ”λ° μ„Έμ…˜λ‚˜λ¦„μ˜ μž₯점도 μžˆκ² μ§€λ§Œ μ΄λ ‡κ²Œ 될 κ²½μš°μ—

μ„œλ²„μ—μ„œ μ„Έμ…˜μ„ λ§Œλ“€κΈ° λ•Œλ¬Έμ— νšŒμ›μ΄ λ§Žμ•„μ§ˆμˆ˜λ‘ μ„œλ²„μ—μ„œ μ°¨μ§€ν•˜λŠ” λ°μ΄ν„°μ˜ 양이 λ§Žμ•„μ Έ

μ„œλ²„μ— 뢀담이 생길 것이닀.

 

JWT(jsonwebtoken) 원리

μ„Έμ…˜μ˜ μ΄λŸ¬ν•œ λ‹¨μ μœΌλ‘œ λ³΄μ™„λœ 것이 λ°”λ‘œ 토큰이닀.

 

JWTλŠ” λ§Žμ€ 토큰듀 μ€‘μ˜ ν•˜λ‚˜λ‘œ κ°€μž₯ 보편적으둜 μ‚¬μš©λ˜κ³  μžˆλŠ” 아이이닀.

 

β‘  νšŒμ›μ΄ λ‘œκ·ΈμΈμ„ ν•œλ‹€.

 

β‘‘ μ„œλ²„λŠ” JWTλ₯Ό ν†΅ν•΄μ„œ 토큰을 μƒμ„±ν•˜κ³  μƒμ„±λœ 토큰을 νšŒμ›μ—κ²Œ 전솑해쀀닀,

 

β‘’ μ„œλ²„λ‘œλΆ€ν„° 받은 토큰을 ν΄λΌμ΄μ–ΈνŠΈλŠ” λ³΄κ΄€ν•˜κ²Œ λœλ‹€.

(μ΄λ•Œ μ €μž₯방식은 Local Storage, cookie λ“± λ‹€μ–‘ν•˜λ‹€)

 

β‘£ 이 이후에 νšŒμ›μ€ λ‘œκ·ΈμΈμ„ ν•œ νšŒμ›λ§Œ μ ‘κ·Όν•  수 μžˆλŠ”μš”μ²­μ„ ν•  κ²½μš°μ—,

μ„œλ²„μ—κ²Œ λ‘œκ·ΈμΈμš”μ²­μ„ ν–ˆμ„λ•Œ λ°›μ•˜λ˜ 토큰을 Header에 μ €μž₯ν•΄ 토큰을 μ „λ‹¬ν•œλ‹€.

 

β‘€ μ„œλ²„λŠ” νšŒμ›μœΌλ‘œλΆ€ν„° 받은 토큰을 톡해 직접 λ§Œλ“  토큰이 λ§žλŠ” 지 확인을 ν•œ 후에,

νšμΈλ˜μ—ˆμ„ 경우 μš”μ²­μ— λ”°λ₯Έ 응닡을 전솑해 μ€€λ‹€.

 

μΈμ¦λ°©μ‹μ—μ„œ μ„Έμ…˜κ³Ό ν† ν°μ˜ κ°€μž₯ 큰 차이점은

μ„Έμ…˜μ€ μ„œλ²„κ°€ μ„Έμ…˜μ„ κ°€μ§€κ³ μžˆκ³  ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ IDλ₯Ό λΆ€μ—¬ν•œλ‹€λ©΄,

토큰은 ν΄λΌμ΄μ–ΈνŠΈμžμ²΄μ— 토큰을 λΆ€μ—¬ν•˜λŠ” λ°©μ‹μœΌλ‘œ μ„œλ²„μ— μš©λŸ‰λΆ€λ‹΄μ΄ 훨씬 적닀.

 

JWT(jsonwebtoken)의 ꡬ쑰

☝🏻 헀더 (header)

alg : μ–΄λ–€ μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ μ•”ν˜Έν™” ν• κ±°μ•Ό?

typ : μ–΄λ–€ νƒ€μž…μ˜ 토큰이야?

 

✌🏻 λ‚΄μš© (payload)

•ν† ν°μ—μ„œ μ‚¬μš©ν•  μ •λ³΄μ˜ 쑰각이 λ‹΄κ²¨μžˆλ‹€.

λ‚΄κ°€ μ •λ³Όλ₯΄ μΆ”κ°€ν•  μˆ˜λ„ μžˆλ‹€.

νŽ˜μ΄λ‘œλ“œμ—” 값이 많이 λ“€μ–΄κ°ˆμˆ˜λ‘ λ°μ΄ν„°μ˜ 양이 μ¦κ°€ν•˜κΈ° λ•Œλ¬Έμ— μ΅œμ†Œν•œμ˜ 값을 λ„£μ–΄μ£ΌλŠ” 것이 μ’‹λ‹€.

μ˜€ν”ˆλœ κ΅¬μ—­μœΌλ‘œ 곡개되면 μ•ˆλ˜λŠ” 정보λ₯Ό λ„£μ–΄μ„œλŠ” μ•ˆλœλ‹€.

•id(id 정보), name(name 정보), exp(κΈ°ν•œ) λ“± λ‹€μ–‘ν•œ 정보듀이 λ“€μ–΄κ°ˆ 수 μžˆλ‹€.

 

🀟🏻 μ„œλͺ… (signature)

헀더와 λ‚΄μš©μ„ μ•”ν˜Έν™˜ κ°’μœΌλ‘œ secrete keyκ°€ μΆ”κ°€λ˜μ–΄ μ•”ν˜Έν™”κ°€ λ˜μ—ˆλ‹€κ³  보면 λœλ‹€.

 

Access token / Refresh token

Access token : μ‚¬μš©μžμ˜ κΆŒν•œμ„ 얻을 λ•Œ μ‚¬μš©λ˜λ©°, μΈμ¦ν•˜λŠ” μ ˆμ°¨μ—μ„œ 핡심을 μ‚¬μš©λ˜λŠ” 토큰이닀.

Refresh token : Access token이 μƒμ„±λ λ•Œ λ™μ‹œμ— μƒμ„±λ˜λ©°, Access token보닀 κΈ΄ μœ νš¨κΈ°κ°„μ„ μ£Όκ³  μƒμ„±λ˜λ©°,

Access token이 만료될 κ²½μš°μ— 갱신을 ν•˜κΈ° μœ„ν•œ λͺ©μ μœΌλ‘œ μ‚¬μš©λ˜λ©°, Refresh token은 ν•„μˆ˜λ‘œ λ§Œλ“€μ–΄μ•Ό λ˜λŠ” 것은 μ•„λ‹ˆλ‹€.

 

λ©”μ†Œλ“œ

sign : 토큰 μƒμ„±ν•˜κΈ° 

sign( ) { _____ , _____ , _____ , _____ } 

1st 인자 - νŽ˜μ΄λ‘œλ“œ
2nd 인자 - λΉ„λ°€ν‚€ (λΉ„λ°€ν‚€λŠ” λˆ„κ΅¬μ—κ²Œλ„ λ³΄μ—¬μ Έμ„œλŠ” μ•ˆλœλ‹€)
3rd 인자 - 토큰 정보 (ex. μœ νš¨κΈ°κ°„)
4th 인자 - μ½œλ°±ν•¨μˆ˜ (μƒλž΅κ°€λŠ₯ν•˜λ©°, 없을 μ‹œμ— λ™κΈ°μ²˜λ¦¬)

 

• verify : κΆŒν•œ ν™•μΈν•˜κΈ°

  - jsonwebtoken λͺ¨λ“ˆ κΆŒν•œμ„ ν™•μΈν•˜λŠ” λ©”μ„œλ“œ

  - 반볡적으둜 μž‘μ„±ν•˜λŠ”κ²ƒμ„ ν”Όν•˜κΈ° μœ„ν•΄ 보톡 λ―Έλ“€μ›¨μ–΄λ‘œ 잘 μ‚¬μš©λœλ‹€.

verify( ) { _____ , _____ }

1st 인자 - token (인증이 된 토큰인지 ν™•μΈν•˜λŠ” μš©λ„)
2nd 인자 - secret key (μ•”ν˜Έν™” λœκ²ƒμ„ λ””μ½”λ”© ν•˜λŠ” μš©λ„)

 

 

λ°˜μ‘ν˜•

λŒ“κΈ€