Watcher Habitμ κ°μΈμ μ΅κ΄μ ν¨κ³Όμ μΌλ‘ κ΄λ¦¬νκ³ , μκ·λͺ¨ κ·Έλ£Ήκ³Ό μ΅κ΄μ 곡μ νλ νλ«νΌμ λλ€. μ¬μ©μλ€μ΄ μλ‘μ μ΅κ΄μ 곡μ νλ©°, μλ‘λ₯Ό μ§μΌλ³΄λ©΄μ λκΈ°λΆμ¬λ₯Ό μ»μ μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ μ΅κ΄μ μ§μμ±μ λμ΄κ³ , κ·Έλ£Ή λ΄μ λλ£λ€κ³Ό ν¨κ» μ±μ₯νλ κ²½νμ ν μ μμ΅λλ€.
πΉ μμ° μμ: Watcher Habit μμ° μμ μ νλΈ λ§ν¬
νλ‘ νΈμλ
λ°±μλ
Β Β 1. κΈ°μ μ λμ κ³Ό νμ΅ λκΈ°
Β Β 2. μ΅κ΄ κΈ°λ‘μ ν΅ν λκΈ° λΆμ¬
Β Β 3. μΉ μ ν리μΌμ΄μ 'Watcher Habit' νμ
Β Β Β Β 1) μ€μκ° μλ¦Όμ μ€μμ±κ³Ό νμμ±
Β Β Β Β 2) μλ¦Ό μ μ‘ λ°©λ²μ μ νκ³Ό SSEμ λμ
Β Β Β Β 3) μ€μκ° μλ¦Ό ꡬν μμΈ
Β Β Β Β 4) μ€μκ° μλ¦Ό κΈ°λ₯ ꡬν κ²°κ³Ό
Β Β Β Β 5) SSEμ νκ³μ μΉμμΌμ μ¬μ©νμ§ μμμ μκΈ΄ μμ¬μ΄ μ
Β Β 2. λ‘κ·ΈμΈ κ³Όμ μμμ 보μ κ³ λ €μ¬ν
Β Β Β Β 1) μ¬μ©μμ λ°μ΄ν°λ₯Ό μμ νκ² μ μ₯
Β Β Β Β 2) μ¬μ©μμ λ°μ΄ν° κ΄λ¦¬λ₯Ό μν ν ν° κΈ°λ° μ ν
Β Β Β Β 3) ν ν° κ΄λ¦¬μ κ°±μ λ©μ»€λμ¦
Β Β 4) ꡬν κ²°κ³Ό
- μ κΈ°μ λμ κ²½ν: μλ‘μ΄ κΈ°μ κ³Ό λΌμ΄λΈλ¬λ¦¬λ₯Ό μ€μ νλ‘μ νΈμ μ μ©ν΄λ³΄κ³ , μ΄λ₯Ό ν΅ν΄ κΈ°μ μ μλμ νμ₯νκ³ μ νμ΅λλ€. μμ μ μΈ κΈ°μ μ€νμ νμ©νλ©΄μλ, νλ‘μ νΈμ ν¨μ¨μ±μ λμ΄λ λ°©λ²μ νꡬνλ λ° μ€μ μ λμμ΅λλ€.
- μμ΄λμ΄ λ°°κ²½: κ°μΈμ μΌλ‘ μ΅κ΄ νμ±μ κΈ°λ‘νκ³ μμμ§λ§, νΌμμλ§ κΈ°λ‘νλ€ λ³΄λ μ§μμ μΈ λκΈ° λΆμ¬μ νκ³κ° μμμ λκΌμ΅λλ€. μ΄λ¬ν λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄, μ΅κ΄μ μλ‘ κ³΅μ νκ³ ν¨κ» νμΈν μ μλ μκ·λͺ¨ κ·Έλ£Ήμ νμ±νλ μμ΄λμ΄λ₯Ό λ μ¬λ¦¬κ² λμμ΅λλ€. μ΄ μμ΄λμ΄λ 리μ‘νΈλ₯Ό μ¬μ©ν΄ μΆ©λΆν ꡬν κ°λ₯νλ©΄μ, κ΄λ¦¬ν΄μΌ ν μνκ° λ§μ μν κ΄λ¦¬ ν΄μ νμμ±λ μμλμμ΅λλ€. λν, μλ²μ ν΄λΌμ΄μΈνΈλ₯Ό λΆλ¦¬νμ¬ μμ νλ λ± κΈ°μ‘΄ νλ‘μ νΈμλ λ€λ₯Έ κΈ°μ μ λμ μ ν¬ν¨νκ³ μμμ΅λλ€.
- νλ‘μ νΈ κ°μ: νμλ€μ κΈ°μ μ ν₯λ―Έμ μ΅κ΄ κΈ°λ‘ μμ΄λμ΄κ° κ²°ν©λμ΄, μλ‘μ μ΅κ΄μ λͺ¨λν°λ§νκ³ λκΈ°λ₯Ό λΆμ¬ν μ μλ μΉ μ ν리μΌμ΄μ 'Watcher Habit'μ΄ νμνμ΅λλ€. μ΄ μ ν리μΌμ΄μ μ μ¬μ©μλ€μ΄ μλ‘μ μ΅κ΄μ μ§μΌλ³΄λ©° κ²©λ €νκ³ μ§μν μ μλ κΈ°λ₯μ μ 곡νμ¬, λ ν¨κ³Όμ μΈ μ΅κ΄ νμ±μ λμ΅λλ€.
3μ£Ό λμ κ°λ°μ μ§ννλ©΄μ κ²ͺμλ μλ²μ ν΄λΌμ΄μΈνΈμμ λ°μν ν΅μ¬μ μΈ λ¬Έμ λ€μ μ λ¦¬ν΄ λ³΄μμ΅λλ€.
νλ‘μ νΈμ ν΅μ¬ κΈ°λ₯ μ€ νλλ μ¬μ©μκ° μ΄ν리μΌμ΄μ λ΄μμ λ°μνλ λ€μν μ΄λ²€νΈλ€μ λν΄ μ€μκ°μΌλ‘ μλ¦Όμ λ°λ κ²μ΄μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ μ¬μ©μλ μλ‘μ΄ κ·Έλ£Ή μ΄λ, μ΅κ΄ νμΈ μμ², μλ¦Ό μΉμΈ μμ² λ±μ μ΄λ²€νΈλ₯Ό μ¦κ°μ μΌλ‘ μΈμ§νκ³ λ°μν μ μμ΄μΌ νμ΅λλ€.
μ€μκ° μλ¦Όμ ꡬννκΈ° μν μ¬λ¬ λ°©λ² μ€, Server-Sent Events (SSE)λ₯Ό μ νν μ΄μ λ λ€μκ³Ό κ°μ΅λλ€:
- κ°λ¨ν ꡬν: SSEλ μΉ νμ€ κΈ°μ λ‘μ ꡬνμ΄ κ°λ¨νλ©°, μΆκ°μ μΈ λΌμ΄λΈλ¬λ¦¬λ νλ μμν¬ μμ΄λ μΉ μλ²μ λΈλΌμ°μ μμ μ§μλ©λλ€.
- μλ μ¬μ°κ²°: λ§μ½ λ€νΈμν¬ λ¬Έμ λ‘ μ°κ²°μ΄ λμ΄μ‘μ λ, SSEλ μλμΌλ‘ μ¬μ°κ²°νλ κΈ°λ₯μ λ΄μ₯νκ³ μμ΄, λ³λμ μ¬μ°κ²° λ‘μ§μ ꡬνν νμκ° μμμ΅λλ€.
- λ¨λ°©ν₯ ν΅μ μΌλ‘ μΆ©λΆν ꡬν κ°λ₯νλ€κ³ νλ¨: νλ‘μ νΈμμ νμν μλ¦Όμ λ°κΈ°λ§ νλ©΄ μλ²μμ λ€λ₯Έ μμ μ ν΄μ£Όμ§ μμλ λλ κ²μΌλ‘ κΈ°ννκΈ° λλ¬Έμ, λ¨λ°©ν₯ μ μ‘ λ°©λ²μΈ SSEλ‘ μΆ©λΆν ꡬνμ΄ κ°λ₯νμ΅λλ€.
νλ‘μ νΈμμλ initEventSource
ν¨μλ₯Ό μ¬μ©νμ¬ SSE μ°κ²°μ μ΄κΈ°ννμκ³ , μ°κ²°μ΄ μ±κ³΅μ μΌλ‘ μ΄λ£¨μ΄μ§λ©΄ μλ²μμ ν΄λΌμ΄μΈνΈλ‘ μλ¦Ό λ°μ΄ν°λ₯Ό μ μ‘ν©λλ€. μ΄λ₯Ό μμ ν ν΄λΌμ΄μΈνΈλ μλ¦Ό λ©μμ§λ₯Ό νλ©΄μ νμνλ©°, μΌμ μκ° νμλ μλμΌλ‘ μλ¦Όμ νλ©΄μμ μ κ±°ν©λλ€.
SSEλ₯Ό λμ ν¨μΌλ‘μ¨ μ¬μ©μλ μ΄ν리μΌμ΄μ μμ λ°μνλ μ€μν μ΄λ²€νΈλ€μ μ€μκ°μΌλ‘ νμΈν μ μκ² λμμ΅λλ€. μ΄λ₯Ό ν΅ν΄ μ¬μ©μλ νμν μ 보λ μμ²μ μ¦μ νμΈνκ³ μ²λ¦¬ν μ μκ² λμ΄ μ¬μ©μ κ²½νμ ν₯μμ μ΄λ£° μ μμμ΅λλ€.
λν, μλ²μμ ν΄λΌμ΄μΈνΈλ‘μ μ€μκ° ν΅μ ꡬνμΌλ‘ μΈν΄ νλ‘μ νΈμ λμ μΈ μνΈμμ©μ΄ νλλμμ΅λλ€.
μ°λ¦¬ νλ‘μ νΈμμλ SSEλ₯Ό μ¬μ©νμ¬ μ€μκ° μλ¦Ό κΈ°λ₯μ ꡬννμμ΅λλ€. SSEμλ λ€μν μ₯μ μ΄ μμ§λ§, λμμ μΉμμΌμ λΉν΄ λͺ κ°μ§ νκ³μ μ΄ μμ΅λλ€.
SSEμ νκ³
-
λ¨λ°©ν₯ ν΅μ : SSEλ μλ²μμ ν΄λΌμ΄μΈνΈλ‘μ λ¨λ°©ν₯ ν΅μ λ§ μ§μν©λλ€. μ΄λ‘ μΈν΄ ν΄λΌμ΄μΈνΈμμμ λμμ΄ μλ²μ μ€μκ°μΌλ‘ λ°μλκΈ° μ΄λ ΅μ΅λλ€. μλ₯Ό λ€λ©΄, μλ¦Όμμμ νΉμ μ‘μ μ μλ²μ μ¦κ°μ μΌλ‘ λ°μνλ κ²μ΄ μ΄λ ΅μ΅λλ€.
-
μ§μμ μ°κ²° μ μ§: λ§μ μ¬μ©μκ° λμμ SSE μ°κ²°μ μ μ§ν κ²½μ° μλ²μ λΆνκ° μ¦κ°νκ² λ©λλ€. νμ¬ μ°κ²°λ μ μ idλ₯Ό λͺ¨λ connectionμΌλ‘ λͺ¨μλκ³ μλλ° μ΄ ν¬κΈ°κ° 컀μ§λ©΄ μλ² λ΄μμ λ©λͺ¨λ¦¬λ₯Ό κ³μν΄μ λ§μ΄ μ°¨μ§ν μ μκΈ° λλ¬Έμ λΆνκ° μ¦κ°νλ μμΈμ΄ λ©λλ€.
μΉμμΌμ μ₯μ λ° νλ‘μ νΈμμμ μμ¬μ
-
μλ°©ν₯ ν΅μ : μΉμμΌμ μλ²μ ν΄λΌμ΄μΈνΈ κ°μ μλ°©ν₯ ν΅μ μ μ§μν©λλ€. μ΄λ‘ μΈν΄ μλ¦Όμ°½μ μ€μκ° κ°±μ κ³Ό κ°μ κΈ°λ₯μ λ ν¨μ¨μ μΌλ‘ ꡬνν μ μμ΅λλ€.
-
μλ¦Όμ°½ μ€μκ° κ°±μ : νλ‘μ νΈμμλ 리μ‘νΈ μΏΌλ¦¬λ₯Ό μ¬μ©νμ¬ 10μ΄λ§λ€ μλ¦Όμ μ‘°ννλ λ°©μμ μ±ννμμ΅λλ€. μΉμμΌμ μ¬μ©νλ€λ©΄, μλ²μμ μ κ· μλ¦Ό λ°μ μ ν΄λΌμ΄μΈνΈμ μ¦μ μ μ‘νμ¬ μλ¦Όμ°½μ μ€μκ°μΌλ‘ κ°±μ νλ κ²μ΄ κ°λ₯νμ κ²μ λλ€.
-
ν¨μ¨μ± λ° λ€νΈμν¬ μ΅μ ν: μΉμμΌμ λ°μ΄ν°λ₯Ό μ μ‘ν λ ν€λκ° λΆνμνμ¬, λ€νΈμν¬μ μ€λ²ν€λκ° μ μ΅λλ€. λ°λΌμ, μ€μ λ‘ μλ¦Όμ΄ λ°μνμ λλ§ λ°μ΄ν°λ₯Ό μ μ‘νκ² λμ΄ λ€νΈμν¬ λ¦¬μμ€λ₯Ό λ³΄λ€ ν¨μ¨μ μΌλ‘ μ¬μ©ν μ μμ΅λλ€.
-
νμ₯μ±: μΉμμΌμ λ€μν μ€μκ° κΈ°λ₯μ λν νμ₯μ±μ΄ λμ΅λλ€. νλ‘μ νΈμ λ°μ μ λ°λΌ λ€μν μ€μκ° μνΈμμ© κΈ°λ₯μ μΆκ°ν λ, μΉμμΌμ μλ°©ν₯ ν΅μ λ₯λ ₯μ νμ©νλ©΄ λ³΄λ€ ν¨κ³Όμ μΌλ‘ ꡬνν μ μμμ κ²μ λλ€.
κ²°λ‘ μ μΌλ‘, SSEλ νμ¬ μ ν¬ νλ‘μ νΈμμ νμν κΈ°λ₯μ λΉ λ₯΄κ³ κ°νΈνκ² κ΅¬ννλ λ°μλ μΆ©λΆνμμ΅λλ€. νμ§λ§ λ―Έλμ νλ‘μ νΈ νμ₯μ±μ κ³ λ €νλ€λ©΄, μΉμμΌμ λ§μ κΈ°λ₯μ λ³΄λ€ ν¨κ³Όμ μΌλ‘ ꡬνν μ μλ κ°λ ₯ν λκ΅¬λ‘ μμ©ν κ² κ°μ΅λλ€. λ°λΌμ, λ€μ λ¨κ³μ κ°λ°μμλ μΉμμΌμ λμ λ° νμ©μ κ³ λ €ν΄λ³Ό νμκ° μλ€κ³ μκ°λ©λλ€. μ΄λ₯Ό ν΅ν΄ μ¬μ©μ κ²½νμ λμ± ν₯μμν€κ³ , νλ‘μ νΈμ κΈ°μ μ νκ³λ₯Ό λν μ μμ κ²μΌλ‘ κΈ°λλ©λλ€.
μμ²ν΄λΉ νλ‘μ νΈμμλ μ¬μ©μμ λ°μ΄ν°λ₯Ό μμ νκ² κ΄λ¦¬νκΈ° μν΄ JWT ν ν° κΈ°λ°μ λ‘κ·ΈμΈ μμ€ν μ ꡬννμ΅λλ€. μ¬μ©μκ° λ‘κ·ΈμΈμ ν΅ν΄ μλ²μ λ°μ΄ν°λ₯Ό μ μ₯ν μ μμΌλ©°, μ΄λ κΈ°κΈ°μμλ μΈμ λ μ§ μ κ·Όν μ μλλ‘ λ³΄μ₯νμ΅λλ€. μ΄ κ³Όμ μμ κ°μ₯ μ€μν κ³ λ €μ¬νμ ν΄λΌμ΄μΈνΈ μΈ‘μμ ν ν°μ μμ νκ² μ μ₯νκ³ , ν ν°μ κ°±μ κ³Ό λ§λ£ μ²λ¦¬λ₯Ό ν¨κ³Όμ μΌλ‘ κ΄λ¦¬νλ κ²μ΄μμ΅λλ€.
-
XSS 곡격 λ°©μ΄: μ¬μ©μ ν ν°μ XSS(ν¬λ‘μ€ μ¬μ΄νΈ μ€ν¬λ¦½ν ) 곡격μΌλ‘λΆν° 보νΈνκΈ° μν΄, ν ν° μ μ₯ λ°©λ²μ μ μ€νκ² μ ννμ΅λλ€. νΉν, JavaScript μ κ·Όμ μ°¨λ¨ν μ μλ HttpOnly μΏ ν€λ₯Ό μ ννμ¬ ν ν°μ μ μ₯ν¨μΌλ‘μ¨, μ μ± μ€ν¬λ¦½νΈκ° ν ν°μ μ κ·Όνλ μνμ μ΅μννμ΅λλ€.
-
ν ν° νμ·¨ λ°©μ§: μ©μμ ν ν°μ΄ νμ·¨λΉνλ μ μ©μ λ°©μ§νκΈ° μν΄, μ‘μΈμ€ ν ν°μ μλͺ μ μ§§κ² μ€μ νκ³ , 리νλ μ ν ν°μ μ¬μ©νμ¬ λ§λ£λ μ‘μΈμ€ ν ν°μ μ¬λ°κΈνλ λ°©μμ λμ νμ΅λλ€. μ΄λ‘μ¨, ν ν°μ΄ νμ·¨λλλΌλ κ·Έ μ ν¨ κΈ°κ°μ΄ 짧μ μ μ©λ κ°λ₯μ±μ μ€μμ΅λλ€.
-
μμ ν ν ν° μ μ₯ λ°©λ²: JavaScriptκ° μ κ·Όν μ μλ HttpOnly μΏ ν€λ₯Ό μ¬μ©ν΄ ν ν°μ μ μ₯ν¨μΌλ‘μ¨, ν΄λΌμ΄μΈνΈ μΈ‘μμμ ν ν° λ³΄μμ κ°ννμ΅λλ€. μ΄ λ°©λ²μ ν΅ν΄ XSS 곡격μΌλ‘λΆν° ν ν°μ 보νΈν μ μμμ΅λλ€.
-
ν ν° κ°±μ λ©μ»€λμ¦: Axios Interceptorsλ₯Ό νμ©νμ¬, API νΈμΆ μ μ ν ν°μ μ ν¨μ±μ κ²μ¦νλ μμ€ν μ ꡬμΆνμ΅λλ€. λ§μ½ μ‘μΈμ€ ν ν°μ΄ λ§λ£λ κ²½μ°, 리νλ μ ν ν°μ ν΅ν΄ μλ‘μ΄ μ‘μΈμ€ ν ν°μ λ°μμ€κ³ , API νΈμΆμ κ³μ μνν μ μλλ‘ κ΅¬ννμ΅λλ€.
-
리νλ μ ν ν° λ§λ£ μ²λ¦¬: 리νλ μ ν ν°μ΄ λ§λ£λ κ²½μ°, μ¬μ©μκ° λ€μ λ‘κ·ΈμΈμ ν΄μΌ νλ μν©μ κ³ λ €νμ¬ λ‘κ·ΈμΈ νμ΄μ§λ‘ 리λ€μ΄λ νΈνλλ‘ μ€μ νμ΅λλ€. μ΄λ₯Ό ν΅ν΄ μ¬μ©μ μΈμ μ΄ μμ νκ² κ΄λ¦¬λλλ‘ νμ΅λλ€.
-
μΏ ν€λ₯Ό μ΄μ©ν ν ν° μ λ¬ μ΄μ ν΄κ²°: λ‘컬 νκ²½μμ μΏ ν€λ₯Ό ν΅ν ν ν° μ λ¬ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄, CORS μ€μ μ μ μ ν μμ νκ³ withCredentials μ΅μ μ νμ±ννμ΅λλ€. μ΄λ₯Ό ν΅ν΄ μλ²μ ν΄λΌμ΄μΈνΈ κ°μ 보μ λ¬Έμ λ₯Ό ν΄κ²°νκ³ , μΏ ν€ κΈ°λ°μ ν ν° μ λ¬ λ°©μμ μμ μ μΌλ‘ ꡬνν μ μμμ΅λλ€.
μ΄ νλ‘μ νΈλ₯Ό ν΅ν΄ μΏ ν€μ CORS μ€μ μ μ€μμ±μ μΈμνκ³ , μ΄λ₯Ό μ μ ν μ€μ ν¨μΌλ‘μ¨ ν΄λΌμ΄μΈνΈμ μλ² κ°μ 보μ λ¬Έμ λ₯Ό ν¨κ³Όμ μΌλ‘ ν΄κ²°νμ΅λλ€. μ΄λ₯Ό ν΅ν΄ μ¬μ©μ λ°μ΄ν°μ μμ ν κ΄λ¦¬λ₯Ό μ€ννκ³ , λ‘κ·ΈμΈμ μ λ’°μ±μ ν¬κ² ν₯μμν¬ μ μμμ΅λλ€.