Session / JWT

μ§€λ‚œλ²ˆ 쿠킀와 μ›ΉμŠ€ν† λ¦¬μ§€μ— λŒ€ν•΄μ„œ κ³΅λΆ€ν•΄λ³΄μ•˜λŠ”λ° μ΄μ–΄μ„œ μ΄λ²ˆμ—” 인증/인가방식에 λŒ€ν•΄μ„œ 곡뢀해보렀고 ν•œλ‹€.

인증 / 인가

인증과 μΈκ°€λΌλŠ” 단어가 λ‚˜μ™”λŠ”λ° μž μ‹œ μš©μ–΄λ₯Ό μ •λ¦¬ν•˜κ³  κ°€μž.

인증 (Authentication) μ΄λž€ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μ‚¬μš©μž 본인이 λ§žλŠ”μ§€ ν™•μΈν•˜λŠ” 과정이닀. μš°λ¦¬κ°€ ν”νžˆ λ§ν•˜λŠ” 둜그인이라고 μƒκ°ν•˜λ©΄ νŽΈν•˜λ‹€.

**인가(Authorization)**λŠ” 인증을 ν•œ 후에 μˆ˜ν–‰λ˜λ©°, 인증된 μ‚¬μš©μžκ°€ μ–΄λ–€ μžμ›μ— λŒ€ν•˜μ—¬ 접근이 κ°€λŠ₯ν•œμ§€ ν™•μΈν•˜λŠ” 과정이닀.

κ°„λ‹¨ν•œ μ˜ˆμ‹œλ₯Ό λ“€μžλ©΄, λ‚˜λ„ ꡬ글에 둜그인이 κ°€λŠ₯ν•˜κ³  동생도 둜그인이 κ°€λŠ₯ν•˜λ‹€. ꡬ글 db상에 λ“±λ‘λœ μ‚¬μš©μžκ°€ 본인이 λ§žλŠ”μ§€ ν™•μΈν•˜κ³  등둝이 λ˜μ–΄μžˆκ³  본인이 맞음이 ν™•μΈλœλ‹€λ©΄ 인증 (둜그인)이 λ˜λŠ”κ²ƒμ΄λ‹€. ν•˜μ§€λ§Œ, λ‚΄κ°€ μž‘μ„±ν•œ κ²Œμ‹œκΈ€μ„ 동생이 μˆ˜μ •ν• μˆ˜λŠ” μ—†λ‹€. μ΄μœ λŠ” λ‚΄κ°€ μž‘μ„±ν•œ κ²Œμ‹œλ¬Όμ— λŒ€ν•΄μ„œ 동생은 μˆ˜μ •μž‘μ—… 접근이 λΆˆκ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. 이것이 인가이닀.

λ‹€μ‹œ λŒμ•„μ™€μ„œ, ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μœ μ €κ°€ λ‘œκ·ΈμΈμ„ μ‹œλ„μš”μ²­μ„ 보낸 ν›„, μ„±κ³΅ν–ˆλ‹€λ©΄ μ„œλ²„λŠ” ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 인증이 μ™„λ£Œλ˜μ—ˆλ‹€λΌλŠ” 의미둜 μ„Έμ…˜μ΄λ‚˜ 토큰을 μ „μ†‘ν•œλ‹€.

κ·Έλ ‡λ‹€λ©΄ μ—¬κΈ°μ„œ μ„Έμ…˜κ³Ό ν† ν°μ˜ 차이λ₯Ό μ•Œμ•„λ³΄μž

μ„Έμ…˜

λ¨Όμ € μ„Έμ…˜μ€ μ‚¬μš©μžμ˜ 인증정보가 μ„œλ²„μ˜ μ €μž₯μ†Œμ— μ €μž₯λœλ‹€.

μ‚¬μš©μžκ°€ 둜그인 μš”μ²­μ‹œ, ν•΄λ‹Ή 인증 정보λ₯Ό μ„œλ²„ μ„Έμ…˜ μ €μž₯μ†Œμ— μ €μž₯ ν›„, μ‚¬μš©μžμ—κ²Œ Session IDλ₯Ό λ°œκΈ‰ν•œλ‹€. λ°œκΈ‰ν•œ session idλŠ” λΈŒλΌμš°μ €μ˜ μΏ ν‚€ν˜•νƒœλ‘œ μ €μž₯λœλ‹€.

Session idλŠ” λΈŒλΌμš°μ €μΏ ν‚€μ— μ €μž₯λ˜μ§€λ§Œ, 인증정보 μžμ²΄λŠ” μ„œλ²„μ— μ €μž₯λœλ‹€.

λ”°λΌμ„œ λ‘œκ·ΈμΈμ„ μ„±κ³΅ν–ˆλ‹€λŠ” 증거인 session idκ°€ 쿠킀에 μ €μž₯λ˜μ–΄ 있기 λ•Œλ¬Έμ— ν΄λΌμ΄μ–ΈνŠΈλŠ” λͺ¨λ“  μš”μ²­μ— μΏ ν‚€λ₯Ό λ‹΄μ•„ μ „μ†‘ν•˜κ²Œ λœλ‹€. 이후 μ„œλ²„λŠ” ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ λ„˜μ–΄μ˜¨ 쿠킀에 λ‹΄κΈ΄ session id와 μ„œλ²„μ— μ €μž₯된 session idλ₯Ό λΉ„κ΅ν•˜μ—¬ μΌμΉ˜ν•œ κ²½μš°μ—λ§Œ 인가λ₯Ό μˆ˜ν–‰ν•œλ‹€.

μ„Έμ…˜μ€ 기본적으둜 인증정보λ₯Ό μ„œλ²„μ— μ €μž₯ν•˜κΈ° λ•Œλ¬Έμ— (즉, μƒνƒœμ •λ³΄λ₯Ό μ„œλ²„μ—μ„œ κ΄€λ¦¬ν•œλ‹€) λ³΄μ•ˆμ„±μ΄ 맀우 λ†’λ‹€. λ‹€λ§Œ, ν΄λΌμ΄μ–ΈνŠΈμ˜ μƒνƒœλ₯Ό μ„œλ²„μ—μ„œ μœ μ§€ν•˜κΈ° λ•Œλ¬Έμ— μ„Έμ…˜λ°μ΄ν„°κ°€ μ¦κ°€ν•˜κ²Œ 되면 λΆ€ν•˜κ°€ λ°œμƒν•  ν™•λ₯ μ΄ 크닀.

토큰 (JWT)

μ„Έμ…˜κ³Ό 달리 토큰은 μ‚¬μš©μžμ˜ 인정정보가 μ„œλ²„μ— μ €μž₯λ˜μ§€ μ•Šκ³  ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μ €μž₯λœλ‹€. μ‚¬μš©μžκ°€ 둜그인 μš”μ²­μ‹œ, μ„œλ²„μ—μ„œ 인증이 κ°€λŠ₯ν•œ 토큰을 λ§Œλ“€μ–΄μ„œ ν΄λΌμ΄μ–ΈνŠΈμ— μ „λ‹¬ν•œλ‹€. 이후 ν΄λΌμ΄μ–ΈνŠΈλŠ” μš”μ²­μ‹œ 토큰을 μ„œλ²„λ‘œ μ „λ‹¬ν•˜κ³ , μ„œλ²„μ—μ„œλŠ” ν† ν°μ˜ μœ νš¨μ„±μ€ κ²€μ¦ν•˜μ—¬ μΈμ¦ν•˜λŠ” 방식이닀.

λ‹€μ‹œλ§ν•΄, μ„œλ²„μΈ‘μ—μ„œ 더이상 μƒνƒœλ₯Ό κ΄€λ¦¬ν•˜μ§€(μœ μ§€ν•˜μ§€) μ•ŠκΈ° λ•Œλ¬Έμ— ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­λ§ŒμœΌλ‘œ μΈμ¦μ²˜λ¦¬κ°€ κ°€λŠ₯ν•˜λ‹€.

이 토큰쀑에 κ°€μž₯ 많이 μ‚¬μš©λ˜λŠ” 것이 λ°”λ‘œ JWT이닀. Json Web token의 μ•½μžλ‘œμ¨ 단어 κ·ΈλŒ€λ‘œ Jsonν˜•νƒœλ‘œ 정보λ₯Ό μ£Όκ³  λ°›κΈ° μœ„ν•΄μ„œ μ•”ν˜Έν™”λœ 토큰을 μ‚¬μš©ν•œλ‹€.

JWTλŠ” 헀더, νŽ˜μ΄λ‘œλ“œ, μ‹œκ·Έλ‹ˆμ²˜ λΆ€λΆ„μœΌλ‘œ λ‚˜λ‰œλ‹€.

  • Header μ–΄λ–»κ²Œ 토큰을 검증할것인가 에 λŒ€ν•œ λ‚΄μš©μ„ λ‹΄κ³ μžˆλ‹€.

  • payload 토큰에 λ‹΄κΈ΄ μ‚¬μš©μžμ˜ 정보가 μ €μž₯λœλ‹€. (μœ νš¨κΈ°κ°„, λ‹‰λ„€μž„, λ°œκΈ‰λŒ€μƒ λ“±λ“±) 토큰 μžμ²΄μ— 정보가 λ‹΄κ²¨μžˆκΈ° λ•Œλ¬Έμ— μ„œλ²„μΈ‘μ—μ„œλŠ” dbλ₯Ό μ‚¬μš©ν•  일이 적어진닀.

  • signature 헀더와 νŽ˜μ΄λ‘œλ“œλ₯Ό ν•©μΉœν›„ μ„œλ²„κ°€ μ§€μ •ν•œ secret key둜 μ•”ν˜Έν™”μ‹œν‚€λŠ” 뢀뢄이닀. (이 Secret KeyλŠ” μ„œλ²„κ°€ κ°€μ§€κ³  μžˆλ‹€.) λ•Œλ¬Έμ— 토큰 λ°œκΈ‰ν›„, νŽ˜μ΄λ‘œλ“œμ˜ λ‚΄μš©μ΄ λ³€μ‘°λ˜μ—ˆμ–΄λ„ μ‹œκ·Έλ‹ˆμ²˜μ— μˆ˜μ •μ „μ˜ λ‚΄μš©μ΄ μ €μž₯λ˜μ–΄ 있기 λ•Œλ¬Έμ— 토큰이 λ³€μ‘°λ˜μ—ˆλŠ”μ§€ μˆ˜μ›”ν•˜κ²Œ νŒŒμ•…ν• μˆ˜ μžˆλ‹€.

ν•˜μ§€λ§Œ κ²°κ΅­ JWT도 토큰 νƒˆμ·¨μ˜ μœ„ν—˜μœΌλ‘œλΆ€ν„° 자유둜울수 μ—†κΈ° λ•Œλ¬Έμ—, Access Token, Refresh Token 을 μ‚¬μš©ν•˜λŠ” 방식을 주둜 μ‚¬μš©ν•œλ‹€.

Access Token 은 ν΄λΌμ΄μ–ΈνŠΈκ°€ κ°€μ§€κ³  μžˆλŠ” 토큰이닀. μ—¬κΈ°μ—λŠ” μ‹€μ œ μœ μ €μ˜ 정보가 λ“€μ–΄μžˆλŠ”λ°, μ„œλ²„μ—μ„œλŠ” μš”μ²­μ„ λ°›μœΌλ©΄ 이 토큰을 μ΄μš©ν•˜μ—¬ 응닡을 μ§„ν–‰ν•œλ‹€. 그런데 λ§Œμ•½ Access Token이 XSSλ‚˜ CSRF곡격으둜 인해 νƒˆμ·¨λœλ‹€λ©΄ ν•΄λ‹Ή 토큰이 λ§Œλ£Œλ λ•ŒκΉŒμ§€ κΆŒν•œμ΄ λΆ€μ—¬λ˜λŠ” λ¬Έμ œκ°€ μžˆλ‹€. ν•˜μ§€λ§Œ μ΄κ²ƒμœΌλ‘œ μΈν•˜μ—¬ λ§Œλ£ŒκΈ°κ°„μ΄ μ§§μ•„μ Έ 버린닀면 μ‚¬μš©μž μž…μž₯μ—μ„œλŠ” μ‚¬μš©μž 인증을 계속해야 ν•˜λŠ” λΆˆνŽΈν•¨μ΄ μƒκΈΈμˆ˜λ°–μ— μ—†λ‹€.

XSS (Cross Site Scriping) : μ‚¬μš©μžκ°€ νŠΉμ • 슀크립트λ₯Ό κ°•μ œλ‘œ μ‹€ν–‰ν•˜λ„λ‘ μœ λ„ν•˜μ—¬ μ•‘μ„ΈμŠ€ 토큰을 νƒˆμ·¨ν•˜λŠ” 곡격법. Stored Xss와 Reflected Xss둜 λ‚˜λ‰œλ‹€. ν΄λΌμ΄μ–ΈνŠΈ μΈ‘μ—μ„œ μ•…μ„±μ½”λ“œκ°€ μ‹€ν–‰λœλ‹€. μ‚¬μš©μžκ°€ μ‚¬μ΄νŠΈλ₯Ό μ‹ λ’°ν•˜μ—¬ λ°œμƒν•¨.

CSRF (Cross-site Request Forgery) : μ‚¬μ΄νŠΈκ°„μ˜ μš”μ²­μ„ μœ„μ‘°ν•˜λŠ”κ²ƒ. κ³΅κ²©μžκ°€ μ˜λ„ν•œ 행동 (μ„œλ²„μ— reqλ₯Ό λ³΄λ‚΄λŠ” 행동 - 등둝, μˆ˜μ • λ“±)을 μ‚¬μ΄νŠΈμ— μš”μ²­ν•˜κ²Œ ν•˜λŠ” 곡격법. μš”μ²­λ°›μ€ μ„œλ²„μΈ‘μ—μ„œ μ•…μ„±μ½”λ“œκ°€ μ‹€ν–‰λœλ‹€. μ‚¬μ΄νŠΈκ°€ μ‚¬μš©μžλ₯Ό μ‹ λ’°ν•˜μ—¬ λ°œμƒν•¨.

μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œ μ‚¬μš©λ˜λŠ”κ²ƒμ΄Refresh Token이닀. **Refresh Token**은 μƒˆλ‘œμš΄ Access Token을 λ°œκΈ‰ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•œλ‹€. Access Token은 짧은 수λͺ…을 κ°€μ§€κ³  있기 λ•Œλ¬Έμ— 만료된 토큰을 μƒˆλ‘­κ²Œ λ°œκΈ‰ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” 토큰이닀.

JWT λ™μž‘κ³Όμ •

λ§ˆμ§€λ§‰μœΌλ‘œ JWT의 λ™μž‘κ³Όμ •μ— λŒ€ν•΄ μ‚΄νŽ΄λ³΄μž

  • ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ 둜그인 μš”μ²­μ„ 보낸닀.

  • μš”μ²­μ„ 받은 μ„œλ²„λŠ” 정보가 λ§žλŠ”μ§€ 확인 ν›„, λ§žλ‹€λ©΄ JWTλ₯Ό Secret Key 둜 μƒμ„±ν•˜κ³  μ‘λ‹΅μœΌλ‘œ 보낸닀.

  • ν΄λΌμ΄μ–ΈνŠΈλŠ” 응닡받은 토큰을 λ‘œμ»¬μΏ ν‚€μ— μ €μž₯ν•œλ‹€.

  • 이후, ν΄λΌμ΄μ–ΈνŠΈλŠ” μ„œλ²„μ— μš”μ²­μ„ λ³΄λ‚Όλ•Œλ§ˆλ‹€ 헀더에 토큰을 ν¬ν•¨ν•˜μ—¬ μ „μ†‘ν•œλ‹€.

  • μ„œλ²„λŠ” μš”μ²­μ΄ μ˜¬λ•Œλ§ˆλ‹€ Secret keyλ₯Ό μ΄μš©ν•˜μ—¬ 전솑받은 토큰이 μœ νš¨ν•œμ§€ κ²€μ¦ν•œλ‹€.

  • 토큰이 κ²€μ¦λœλ‹€λ©΄, 좔가적인 정보확인 없이 인가λ₯Ό μˆ˜ν–‰ν•œλ‹€.

Last updated