Skip to content

sonji406/Watcher-Habit-Client

Β 
Β 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Watcher Habit: μŠ΅κ΄€ 곡유 ν”Œλž«νΌ 🌱


πŸ’β€β™€οΈ μ†Œκ°œ

Watcher Habit은 개인의 μŠ΅κ΄€μ„ 효과적으둜 κ΄€λ¦¬ν•˜κ³ , μ†Œκ·œλͺ¨ κ·Έλ£Ήκ³Ό μŠ΅κ΄€μ„ κ³΅μœ ν•˜λŠ” ν”Œλž«νΌμž…λ‹ˆλ‹€. μ‚¬μš©μžλ“€μ΄ μ„œλ‘œμ˜ μŠ΅κ΄€μ„ κ³΅μœ ν•˜λ©°, μ„œλ‘œλ₯Ό μ§€μΌœλ³΄λ©΄μ„œ 동기뢀여λ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 μŠ΅κ΄€μ˜ 지속성을 높이고, κ·Έλ£Ή λ‚΄μ˜ λ™λ£Œλ“€κ³Ό ν•¨κ»˜ μ„±μž₯ν•˜λŠ” κ²½ν—˜μ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“Ή μ‹œμ—° μ˜μƒ: Watcher Habit μ‹œμ—° μ˜μƒ 유튜브 링크


πŸ› οΈ 기술 μŠ€νƒ

ν”„λ‘ νŠΈμ—”λ“œ

React React Router Dom React Query Redux JWT Decode AWS SDK Axios TailwindCSS ESLint Prettier


λ°±μ—”λ“œ

Node.js Express Express Validator MongoDB AWS SDK Cron jsonwebtoken Server Http Errors ESLint Prettier


πŸ‘€ λͺ©μ°¨

πŸ’‘ ν”„λ‘œμ νŠΈ 동기

Β Β 1. 기술적 도전과 ν•™μŠ΅ 동기

Β Β 2. μŠ΅κ΄€ 기둝을 ν†΅ν•œ 동기 λΆ€μ—¬

Β Β 3. μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 'Watcher Habit' 탄생

🚧 도전 및 문제 ν•΄κ²°

Β Β 1. μ‹€μ‹œκ°„ μ•Œλ¦Ό

Β Β Β Β 1) μ‹€μ‹œκ°„ μ•Œλ¦Όμ˜ μ€‘μš”μ„±κ³Ό ν•„μš”μ„±

Β Β Β Β 2) μ•Œλ¦Ό 전솑 λ°©λ²•μ˜ 선택과 SSE의 λ„μž…

Β Β Β Β 3) μ‹€μ‹œκ°„ μ•Œλ¦Ό κ΅¬ν˜„ 상세

Β Β Β Β 4) μ‹€μ‹œκ°„ μ•Œλ¦Ό κΈ°λŠ₯ κ΅¬ν˜„ κ²°κ³Ό

Β Β Β Β 5) SSE의 ν•œκ³„μ™€ μ›Ήμ†ŒμΌ“μ„ μ‚¬μš©ν•˜μ§€ μ•Šμ•„μ„œ 생긴 μ•„μ‰¬μš΄ 점

Β Β 2. 둜그인 κ³Όμ •μ—μ„œμ˜ λ³΄μ•ˆ 고렀사항

Β Β Β Β 1) μ‚¬μš©μžμ˜ 데이터λ₯Ό μ•ˆμ „ν•˜κ²Œ μ €μž₯

Β Β Β Β 2) μ‚¬μš©μžμ˜ 데이터 관리λ₯Ό μœ„ν•œ 토큰 기반 선택

Β Β Β Β 3) 토큰 관리와 κ°±μ‹  λ©”μ»€λ‹ˆμ¦˜

Β Β 4) κ΅¬ν˜„ κ²°κ³Ό

πŸ”— Repository μ£Όμ†Œ


πŸ’‘ ν”„λ‘œμ νŠΈ 동기

1. 기술적 도전과 ν•™μŠ΅ 동기

  • μ‹ κΈ°μˆ  λ„μž… κ²½ν—˜: μƒˆλ‘œμš΄ 기술과 라이브러리λ₯Ό μ‹€μ „ ν”„λ‘œμ νŠΈμ— μ μš©ν•΄λ³΄κ³ , 이λ₯Ό 톡해 기술적 μ—­λŸ‰μ„ ν™•μž₯ν•˜κ³ μž ν–ˆμŠ΅λ‹ˆλ‹€. μ•ˆμ •μ μΈ 기술 μŠ€νƒμ„ ν™œμš©ν•˜λ©΄μ„œλ„, ν”„λ‘œμ νŠΈμ˜ νš¨μœ¨μ„±μ„ λ†’μ΄λŠ” 방법을 νƒκ΅¬ν•˜λŠ” 데 쀑점을 λ‘μ—ˆμŠ΅λ‹ˆλ‹€.

2. μŠ΅κ΄€ 기둝을 ν†΅ν•œ 동기 λΆ€μ—¬

  • 아이디어 λ°°κ²½: 개인적으둜 μŠ΅κ΄€ ν˜•μ„±μ„ κΈ°λ‘ν•˜κ³  μžˆμ—ˆμ§€λ§Œ, ν˜Όμžμ„œλ§Œ κΈ°λ‘ν•˜λ‹€ λ³΄λ‹ˆ 지속적인 동기 뢀여에 ν•œκ³„κ°€ μžˆμŒμ„ λŠκΌˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄, μŠ΅κ΄€μ„ μ„œλ‘œ κ³΅μœ ν•˜κ³  ν•¨κ»˜ 확인할 수 μžˆλŠ” μ†Œκ·œλͺ¨ 그룹을 ν˜•μ„±ν•˜λŠ” 아이디어λ₯Ό λ– μ˜¬λ¦¬κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 이 μ•„μ΄λ””μ–΄λŠ” λ¦¬μ•‘νŠΈλ₯Ό μ‚¬μš©ν•΄ μΆ©λΆ„νžˆ κ΅¬ν˜„ κ°€λŠ₯ν•˜λ©΄μ„œ, 관리해야 ν•  μƒνƒœκ°€ λ§Žμ•„ μƒνƒœ 관리 툴의 ν•„μš”μ„±λ„ μ˜ˆμƒλ˜μ—ˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ, μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈλ₯Ό λΆ„λ¦¬ν•˜μ—¬ μž‘μ—…ν•˜λŠ” λ“± κΈ°μ‘΄ ν”„λ‘œμ νŠΈμ™€λŠ” λ‹€λ₯Έ 기술적 도전을 ν¬ν•¨ν•˜κ³  μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

3. μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 'Watcher Habit' 탄생

  • ν”„λ‘œμ νŠΈ κ°œμš”: νŒ€μ›λ“€μ˜ 기술적 ν₯미와 μŠ΅κ΄€ 기둝 아이디어가 κ²°ν•©λ˜μ–΄, μ„œλ‘œμ˜ μŠ΅κ΄€μ„ λͺ¨λ‹ˆν„°λ§ν•˜κ³  동기λ₯Ό λΆ€μ—¬ν•  수 μžˆλŠ” μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 'Watcher Habit'이 νƒ„μƒν–ˆμŠ΅λ‹ˆλ‹€. 이 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ μ‚¬μš©μžλ“€μ΄ μ„œλ‘œμ˜ μŠ΅κ΄€μ„ μ§€μΌœλ³΄λ©° κ²©λ €ν•˜κ³  지원할 수 μžˆλŠ” κΈ°λŠ₯을 μ œκ³΅ν•˜μ—¬, 더 효과적인 μŠ΅κ΄€ ν˜•μ„±μ„ λ•μŠ΅λ‹ˆλ‹€.

🚧 도전 및 문제 ν•΄κ²°

3μ£Ό λ™μ•ˆ κ°œλ°œμ„ μ§„ν–‰ν•˜λ©΄μ„œ κ²ͺμ—ˆλ˜ μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ λ°œμƒν•œ 핡심적인 λ¬Έμ œλ“€μ„ 정리해 λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

1. μ‹€μ‹œκ°„ μ•Œλ¦Ό

1) μ‹€μ‹œκ°„ μ•Œλ¦Όμ˜ μ€‘μš”μ„±κ³Ό ν•„μš”μ„±

ν”„λ‘œμ νŠΈμ˜ 핡심 κΈ°λŠ₯ 쀑 ν•˜λ‚˜λŠ” μ‚¬μš©μžκ°€ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ λ‚΄μ—μ„œ λ°œμƒν•˜λŠ” λ‹€μ–‘ν•œ μ΄λ²€νŠΈλ“€μ— λŒ€ν•΄ μ‹€μ‹œκ°„μœΌλ‘œ μ•Œλ¦Όμ„ λ°›λŠ” κ²ƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 μ‚¬μš©μžλŠ” μƒˆλ‘œμš΄ κ·Έλ£Ή μ΄ˆλŒ€, μŠ΅κ΄€ 확인 μš”μ²­, μ•Œλ¦Ό 승인 μš”μ²­ λ“±μ˜ 이벀트λ₯Ό μ¦‰κ°μ μœΌλ‘œ μΈμ§€ν•˜κ³  λ°˜μ‘ν•  수 μžˆμ–΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€.

2) μ•Œλ¦Ό 전솑 λ°©λ²•μ˜ 선택과 SSE의 λ„μž…

μ‹€μ‹œκ°„ μ•Œλ¦Όμ„ κ΅¬ν˜„ν•˜κΈ° μœ„ν•œ μ—¬λŸ¬ 방법 쀑, Server-Sent Events (SSE)λ₯Ό μ„ νƒν•œ μ΄μœ λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

  • κ°„λ‹¨ν•œ κ΅¬ν˜„: SSEλŠ” μ›Ή ν‘œμ€€ κΈ°μˆ λ‘œμ„œ κ΅¬ν˜„μ΄ κ°„λ‹¨ν•˜λ©°, 좔가적인 λΌμ΄λΈŒλŸ¬λ¦¬λ‚˜ ν”„λ ˆμž„μ›Œν¬ 없이도 μ›Ή μ„œλ²„μ™€ λΈŒλΌμš°μ €μ—μ„œ μ§€μ›λ©λ‹ˆλ‹€.
  • μžλ™ μž¬μ—°κ²°: λ§Œμ•½ λ„€νŠΈμ›Œν¬ 문제둜 연결이 λŠμ–΄μ‘Œμ„ λ•Œ, SSEλŠ” μžλ™μœΌλ‘œ μž¬μ—°κ²°ν•˜λŠ” κΈ°λŠ₯을 λ‚΄μž₯ν•˜κ³  μžˆμ–΄, λ³„λ„μ˜ μž¬μ—°κ²° λ‘œμ§μ„ κ΅¬ν˜„ν•  ν•„μš”κ°€ μ—†μ—ˆμŠ΅λ‹ˆλ‹€.
  • 단방ν–₯ ν†΅μ‹ μœΌλ‘œ μΆ©λΆ„νžˆ κ΅¬ν˜„ κ°€λŠ₯ν•˜λ‹€κ³  νŒλ‹¨: ν”„λ‘œμ νŠΈμ—μ„œ ν•„μš”ν•œ μ•Œλ¦Όμ€ λ°›κΈ°λ§Œ ν•˜λ©΄ μ„œλ²„μ—μ„œ λ‹€λ₯Έ μž‘μ—…μ„ 해주지 μ•Šμ•„λ„ λ˜λŠ” κ²ƒμœΌλ‘œ κΈ°νšν–ˆκΈ° λ•Œλ¬Έμ—, 단방ν–₯ 전솑 방법인 SSE둜 μΆ©λΆ„νžˆ κ΅¬ν˜„μ΄ κ°€λŠ₯ν–ˆμŠ΅λ‹ˆλ‹€.

SSE

3) μ‹€μ‹œκ°„ μ•Œλ¦Ό κ΅¬ν˜„ 상세

ν”„λ‘œμ νŠΈμ—μ„œλŠ” initEventSource ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ SSE 연결을 μ΄ˆκΈ°ν™”ν•˜μ˜€κ³ , 연결이 μ„±κ³΅μ μœΌλ‘œ 이루어지면 μ„œλ²„μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈλ‘œ μ•Œλ¦Ό 데이터λ₯Ό μ „μ†‘ν•©λ‹ˆλ‹€. 이λ₯Ό μˆ˜μ‹ ν•œ ν΄λΌμ΄μ–ΈνŠΈλŠ” μ•Œλ¦Ό λ©”μ‹œμ§€λ₯Ό 화면에 ν‘œμ‹œν•˜λ©°, 일정 μ‹œκ°„ ν›„μ—λŠ” μžλ™μœΌλ‘œ μ•Œλ¦Όμ„ ν™”λ©΄μ—μ„œ μ œκ±°ν•©λ‹ˆλ‹€.

4) μ‹€μ‹œκ°„ μ•Œλ¦Ό κΈ°λŠ₯ κ΅¬ν˜„ κ²°κ³Ό

SSEλ₯Ό λ„μž…ν•¨μœΌλ‘œμ¨ μ‚¬μš©μžλŠ” μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ λ°œμƒν•˜λŠ” μ€‘μš”ν•œ μ΄λ²€νŠΈλ“€μ„ μ‹€μ‹œκ°„μœΌλ‘œ 확인할 수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 μ‚¬μš©μžλŠ” ν•„μš”ν•œ μ •λ³΄λ‚˜ μš”μ²­μ„ μ¦‰μ‹œ ν™•μΈν•˜κ³  μ²˜λ¦¬ν•  수 있게 λ˜μ–΄ μ‚¬μš©μž κ²½ν—˜μ˜ ν–₯상을 이룰 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ, μ„œλ²„μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈλ‘œμ˜ μ‹€μ‹œκ°„ 톡신 κ΅¬ν˜„μœΌλ‘œ 인해 ν”„λ‘œμ νŠΈμ˜ 동적인 μƒν˜Έμž‘μš©μ΄ ν™•λŒ€λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

5) SSE의 ν•œκ³„μ™€ μ›Ήμ†ŒμΌ“μ„ μ‚¬μš©ν•˜μ§€ μ•Šμ•„μ„œ 생긴 μ•„μ‰¬μš΄ 점

우리 ν”„λ‘œμ νŠΈμ—μ„œλŠ” SSEλ₯Ό μ‚¬μš©ν•˜μ—¬ μ‹€μ‹œκ°„ μ•Œλ¦Ό κΈ°λŠ₯을 κ΅¬ν˜„ν•˜μ˜€μŠ΅λ‹ˆλ‹€. SSEμ—λŠ” λ‹€μ–‘ν•œ μž₯점이 μžˆμ§€λ§Œ, λ™μ‹œμ— μ›Ήμ†ŒμΌ“μ— λΉ„ν•΄ λͺ‡ 가지 ν•œκ³„μ μ΄ μžˆμŠ΅λ‹ˆλ‹€.

SSE의 ν•œκ³„

  • 단방ν–₯ 톡신: SSEλŠ” μ„œλ²„μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈλ‘œμ˜ 단방ν–₯ ν†΅μ‹ λ§Œ μ§€μ›ν•©λ‹ˆλ‹€. 이둜 인해 ν΄λΌμ΄μ–ΈνŠΈμ—μ„œμ˜ λ™μž‘μ΄ μ„œλ²„μ— μ‹€μ‹œκ°„μœΌλ‘œ 반영되기 μ–΄λ ΅μŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€λ©΄, μ•Œλ¦Όμ—μ„œμ˜ νŠΉμ • μ•‘μ…˜μ„ μ„œλ²„μ— μ¦‰κ°μ μœΌλ‘œ λ°˜μ˜ν•˜λŠ” 것이 μ–΄λ ΅μŠ΅λ‹ˆλ‹€.

  • 지속적 μ—°κ²° μœ μ§€: λ§Žμ€ μ‚¬μš©μžκ°€ λ™μ‹œμ— SSE 연결을 μœ μ§€ν•  경우 μ„œλ²„μ— λΆ€ν•˜κ°€ μ¦κ°€ν•˜κ²Œ λ©λ‹ˆλ‹€. ν˜„μž¬ μ—°κ²°λœ μœ μ € idλ₯Ό λͺ¨λ‘ connection으둜 λͺ¨μ•„놓고 μžˆλŠ”λ° 이 크기가 컀지면 μ„œλ²„ λ‚΄μ—μ„œ λ©”λͺ¨λ¦¬λ₯Ό κ³„μ†ν•΄μ„œ 많이 차지할 수 있기 λ•Œλ¬Έμ— λΆ€ν•˜κ°€ μ¦κ°€ν•˜λŠ” μš”μΈμ΄ λ©λ‹ˆλ‹€.

μ›Ήμ†ŒμΌ“μ˜ μž₯점 및 ν”„λ‘œμ νŠΈμ—μ„œμ˜ 아쉬움

  • μ–‘λ°©ν–₯ 톡신: μ›Ήμ†ŒμΌ“μ€ μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈ κ°„μ˜ μ–‘λ°©ν–₯ 톡신을 μ§€μ›ν•©λ‹ˆλ‹€. 이둜 인해 μ•Œλ¦Όμ°½μ˜ μ‹€μ‹œκ°„ κ°±μ‹ κ³Ό 같은 κΈ°λŠ₯을 더 효율적으둜 κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • μ•Œλ¦Όμ°½ μ‹€μ‹œκ°„ κ°±μ‹ : ν”„λ‘œμ νŠΈμ—μ„œλŠ” λ¦¬μ•‘νŠΈ 쿼리λ₯Ό μ‚¬μš©ν•˜μ—¬ 10μ΄ˆλ§ˆλ‹€ μ•Œλ¦Όμ„ μ‘°νšŒν•˜λŠ” 방식을 μ±„νƒν•˜μ˜€μŠ΅λ‹ˆλ‹€. μ›Ήμ†ŒμΌ“μ„ μ‚¬μš©ν–ˆλ‹€λ©΄, μ„œλ²„μ—μ„œ μ‹ κ·œ μ•Œλ¦Ό λ°œμƒ μ‹œ ν΄λΌμ΄μ–ΈνŠΈμ— μ¦‰μ‹œ μ „μ†‘ν•˜μ—¬ μ•Œλ¦Όμ°½μ„ μ‹€μ‹œκ°„μœΌλ‘œ κ°±μ‹ ν•˜λŠ” 것이 κ°€λŠ₯ν–ˆμ„ κ²ƒμž…λ‹ˆλ‹€.

  • νš¨μœ¨μ„± 및 λ„€νŠΈμ›Œν¬ μ΅œμ ν™”: μ›Ήμ†ŒμΌ“μ€ 데이터λ₯Ό 전솑할 λ•Œ 헀더가 λΆˆν•„μš”ν•˜μ—¬, λ„€νŠΈμ›Œν¬μ˜ μ˜€λ²„ν—€λ“œκ°€ μ μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ, μ‹€μ œλ‘œ μ•Œλ¦Όμ΄ λ°œμƒν–ˆμ„ λ•Œλ§Œ 데이터λ₯Ό μ „μ†‘ν•˜κ²Œ λ˜μ–΄ λ„€νŠΈμ›Œν¬ λ¦¬μ†ŒμŠ€λ₯Ό 보닀 효율적으둜 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • ν™•μž₯μ„±: μ›Ήμ†ŒμΌ“μ€ λ‹€μ–‘ν•œ μ‹€μ‹œκ°„ κΈ°λŠ₯에 λŒ€ν•œ ν™•μž₯성이 λ†’μŠ΅λ‹ˆλ‹€. ν”„λ‘œμ νŠΈμ˜ λ°œμ „μ— 따라 λ‹€μ–‘ν•œ μ‹€μ‹œκ°„ μƒν˜Έμž‘μš© κΈ°λŠ₯을 μΆ”κ°€ν•  λ•Œ, μ›Ήμ†ŒμΌ“μ˜ μ–‘λ°©ν–₯ 톡신 λŠ₯λ ₯을 ν™œμš©ν•˜λ©΄ 보닀 효과적으둜 κ΅¬ν˜„ν•  수 μžˆμ—ˆμ„ κ²ƒμž…λ‹ˆλ‹€.

결둠적으둜, SSEλŠ” ν˜„μž¬ 저희 ν”„λ‘œμ νŠΈμ—μ„œ ν•„μš”ν•œ κΈ°λŠ₯을 λΉ λ₯΄κ³  κ°„νŽΈν•˜κ²Œ κ΅¬ν˜„ν•˜λŠ” λ°μ—λŠ” μΆ©λΆ„ν•˜μ˜€μŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ 미래의 ν”„λ‘œμ νŠΈ ν™•μž₯성을 κ³ λ €ν•œλ‹€λ©΄, μ›Ήμ†ŒμΌ“μ€ λ§Žμ€ κΈ°λŠ₯을 보닀 효과적으둜 κ΅¬ν˜„ν•  수 μžˆλŠ” κ°•λ ₯ν•œ λ„κ΅¬λ‘œ μž‘μš©ν•  것 κ°™μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ, λ‹€μŒ λ‹¨κ³„μ˜ κ°œλ°œμ—μ„œλŠ” μ›Ήμ†ŒμΌ“μ˜ λ„μž… 및 ν™œμš©μ„ κ³ λ €ν•΄λ³Ό ν•„μš”κ°€ μžˆλ‹€κ³  μƒκ°λ©λ‹ˆλ‹€. 이λ₯Ό 톡해 μ‚¬μš©μž κ²½ν—˜μ„ λ”μš± ν–₯μƒμ‹œν‚€κ³ , ν”„λ‘œμ νŠΈμ˜ 기술적 ν•œκ³„λ₯Ό λ„“νž 수 μžˆμ„ κ²ƒμœΌλ‘œ κΈ°λŒ€λ©λ‹ˆλ‹€.


2. 둜그인 κ³Όμ •μ—μ„œμ˜ λ³΄μ•ˆ 고렀사항

1) μ‚¬μš©μžμ˜ 데이터λ₯Ό μ•ˆμ „ν•˜κ²Œ μ €μž₯

μ™“μ²˜ν•΄λΉ— ν”„λ‘œμ νŠΈμ—μ„œλŠ” μ‚¬μš©μžμ˜ 데이터λ₯Ό μ•ˆμ „ν•˜κ²Œ κ΄€λ¦¬ν•˜κΈ° μœ„ν•΄ JWT 토큰 기반의 둜그인 μ‹œμŠ€ν…œμ„ κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€. μ‚¬μš©μžκ°€ λ‘œκ·ΈμΈμ„ 톡해 μ„œλ²„μ— 데이터λ₯Ό μ €μž₯ν•  수 있으며, μ–΄λŠ κΈ°κΈ°μ—μ„œλ‚˜ μ–Έμ œλ“ μ§€ μ ‘κ·Όν•  수 μžˆλ„λ‘ 보μž₯ν–ˆμŠ΅λ‹ˆλ‹€. 이 κ³Όμ •μ—μ„œ κ°€μž₯ μ€‘μš”ν•œ 고렀사항은 ν΄λΌμ΄μ–ΈνŠΈ μΈ‘μ—μ„œ 토큰을 μ•ˆμ „ν•˜κ²Œ μ €μž₯ν•˜κ³ , ν† ν°μ˜ κ°±μ‹ κ³Ό 만료 처리λ₯Ό 효과적으둜 κ΄€λ¦¬ν•˜λŠ” κ²ƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€.

2) μ‚¬μš©μžμ˜ 데이터 관리λ₯Ό μœ„ν•œ 토큰 기반 선택

  • XSS 곡격 λ°©μ–΄: μ‚¬μš©μž 토큰을 XSS(크둜슀 μ‚¬μ΄νŠΈ μŠ€ν¬λ¦½νŒ…) κ³΅κ²©μœΌλ‘œλΆ€ν„° λ³΄ν˜Έν•˜κΈ° μœ„ν•΄, 토큰 μ €μž₯ 방법을 μ‹ μ€‘ν•˜κ²Œ μ„ νƒν–ˆμŠ΅λ‹ˆλ‹€. 특히, JavaScript 접근을 차단할 수 μžˆλŠ” HttpOnly μΏ ν‚€λ₯Ό μ„ νƒν•˜μ—¬ 토큰을 μ €μž₯ν•¨μœΌλ‘œμ¨, μ•…μ„± μŠ€ν¬λ¦½νŠΈκ°€ 토큰에 μ ‘κ·Όν•˜λŠ” μœ„ν—˜μ„ μ΅œμ†Œν™”ν–ˆμŠ΅λ‹ˆλ‹€.

  • 토큰 νƒˆμ·¨ 방지: 용자의 토큰이 νƒˆμ·¨λ‹Ήν•˜λŠ” μ•…μš©μ„ λ°©μ§€ν•˜κΈ° μœ„ν•΄, μ•‘μ„ΈμŠ€ ν† ν°μ˜ 수λͺ…을 짧게 μ„€μ •ν•˜κ³ , λ¦¬ν”„λ ˆμ‹œ 토큰을 μ‚¬μš©ν•˜μ—¬ 만료된 μ•‘μ„ΈμŠ€ 토큰을 μž¬λ°œκΈ‰ν•˜λŠ” 방식을 λ„μž…ν–ˆμŠ΅λ‹ˆλ‹€. 이둜써, 토큰이 νƒˆμ·¨λ˜λ”λΌλ„ κ·Έ 유효 기간이 짧아 μ•…μš©λ  κ°€λŠ₯성을 μ€„μ˜€μŠ΅λ‹ˆλ‹€.

3) 토큰 관리와 κ°±μ‹  λ©”μ»€λ‹ˆμ¦˜

token

  • μ•ˆμ „ν•œ 토큰 μ €μž₯ 방법: JavaScriptκ°€ μ ‘κ·Όν•  수 μ—†λŠ” HttpOnly μΏ ν‚€λ₯Ό μ‚¬μš©ν•΄ 토큰을 μ €μž₯ν•¨μœΌλ‘œμ¨, ν΄λΌμ΄μ–ΈνŠΈ μΈ‘μ—μ„œμ˜ 토큰 λ³΄μ•ˆμ„ κ°•ν™”ν–ˆμŠ΅λ‹ˆλ‹€. 이 방법을 톡해 XSS κ³΅κ²©μœΌλ‘œλΆ€ν„° 토큰을 λ³΄ν˜Έν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

  • 토큰 κ°±μ‹  λ©”μ»€λ‹ˆμ¦˜: Axios Interceptorsλ₯Ό ν™œμš©ν•˜μ—¬, API 호좜 전에 ν† ν°μ˜ μœ νš¨μ„±μ„ κ²€μ¦ν•˜λŠ” μ‹œμŠ€ν…œμ„ κ΅¬μΆ•ν–ˆμŠ΅λ‹ˆλ‹€. λ§Œμ•½ μ•‘μ„ΈμŠ€ 토큰이 만료된 경우, λ¦¬ν”„λ ˆμ‹œ 토큰을 톡해 μƒˆλ‘œμš΄ μ•‘μ„ΈμŠ€ 토큰을 λ°›μ•„μ˜€κ³ , API ν˜ΈμΆœμ„ 계속 μˆ˜ν–‰ν•  수 μžˆλ„λ‘ κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€.

  • λ¦¬ν”„λ ˆμ‹œ 토큰 만료 처리: λ¦¬ν”„λ ˆμ‹œ 토큰이 만료된 경우, μ‚¬μš©μžκ°€ λ‹€μ‹œ λ‘œκ·ΈμΈμ„ ν•΄μ•Ό ν•˜λŠ” 상황을 κ³ λ €ν•˜μ—¬ 둜그인 νŽ˜μ΄μ§€λ‘œ λ¦¬λ‹€μ΄λ ‰νŠΈν•˜λ„λ‘ μ„€μ •ν–ˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 μ‚¬μš©μž μ„Έμ…˜μ΄ μ•ˆμ „ν•˜κ²Œ κ΄€λ¦¬λ˜λ„λ‘ ν–ˆμŠ΅λ‹ˆλ‹€.

  • μΏ ν‚€λ₯Ό μ΄μš©ν•œ 토큰 전달 이슈 ν•΄κ²°: 둜컬 ν™˜κ²½μ—μ„œ μΏ ν‚€λ₯Ό ν†΅ν•œ 토큰 전달 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄, CORS 섀정을 적절히 μˆ˜μ •ν•˜κ³  withCredentials μ˜΅μ…˜μ„ ν™œμ„±ν™”ν–ˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈ κ°„μ˜ λ³΄μ•ˆ 문제λ₯Ό ν•΄κ²°ν•˜κ³ , μΏ ν‚€ 기반의 토큰 전달 방식을 μ•ˆμ •μ μœΌλ‘œ κ΅¬ν˜„ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

4) κ΅¬ν˜„ κ²°κ³Ό

이 ν”„λ‘œμ νŠΈλ₯Ό 톡해 쿠킀와 CORS μ„€μ •μ˜ μ€‘μš”μ„±μ„ μΈμ‹ν•˜κ³ , 이λ₯Ό 적절히 μ„€μ •ν•¨μœΌλ‘œμ¨ ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ κ°„μ˜ λ³΄μ•ˆ 문제λ₯Ό 효과적으둜 ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 μ‚¬μš©μž λ°μ΄ν„°μ˜ μ•ˆμ „ν•œ 관리λ₯Ό μ‹€ν˜„ν•˜κ³ , 둜그인의 신뒰성을 크게 ν–₯μƒμ‹œν‚¬ 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.


πŸ”— Repository Link

Releases

No releases published

Packages

No packages published

Languages

  • JavaScript 99.0%
  • Other 1.0%