π [λ°°κ²½]
userService.findUser(userId);
ν μ¬μ©μκ° λ‘κ·ΈμΈμ μ±κ³΅ν νμ ν ν°μ λ°κΈλ°μ μνμμ νμνν΄λ₯Ό ν ν ν΄λΉ ν ν°μ κ°μ§κ³ λ¨μ μ ν¨κΈ°κ°λμ λ€λ₯Έ μλΉμ€μ μ κ·Όνλ κ²μ λ°©μ§νκΈ° μν΄μλ 맀 μλΉμ€ μμ λΆλΆμ userService.findUser(userId) μ½λλ₯Ό μΆκ°ν΄μ λ°μ΄ν°λ² μ΄μ€μ μ κ·Όν΄ νμμ νμΈμ νλ κ³Όμ μ΄ νμνμ΅λλ€.
νμ§λ§ ν΄λΉ λ‘μ§μ΄ userId λ₯Ό ν΅ν΄μ user κ°μ²΄λ₯Ό κ°μ Έμμ κ·Έ user λ°μ΄ν°λ₯Ό λ€λ£¨λ λ‘μ§μ΄ μλλΌ λ¨μν μ‘°νλ§μ μν¨μ΄λΌλ©΄,
λ©μλμ μ£Όμ λͺ©μ κ³Όλ λ€λ₯Έ μ½λμ΄κ³ , νμ λ°μ΄ν° λ² μ΄μ€ μ κ·Όμ μꡬνκΈ° λλ¬Έμ μ΄λ₯Ό κ³ λ―Όν΄λ³Ό νμκ° μμμ΅λλ€.
π± [μꡬμ¬ν]
νμ νν΄ νμλ κΈ°μ‘΄μ λ°κΈλ ν ν°μ΄ λ¨μ μμ κ²½μ°, μ΄ ν ν°μ μ¬μ©ν΄ νμμ΄ μλΉμ€μ μ κ·Όνμ§ λͺ»νλλ‘ μ°¨λ¨νκ³ , λμμ λΆνμν λ°μ΄ν°λ² μ΄μ€ μ κ·Όμ μ€μ¬ μ±λ₯μ κ°μ ν μ μλ λ°©λ²μ΄ νμν©λλ€.
π‘ [μ νμ§]
1. νμ¬μ²λΌ 맀 μμ²λ§λ€ `userService.findUser(userId)` λ₯Ό νΈμΆν΄ νν΄ μ¬λΆλ₯Ό νμΈνλ λ°©λ²μ λλ€.
νμ§λ§ μ΄ λ°©μμ λ§€λ² λ°μ΄ν°λ² μ΄μ€λ₯Ό μ κ·ΌνκΈ° λλ¬Έμ μ±λ₯μ μΌλ‘ μν΄κ° μμ μ μμ΅λλ€.
2. ν ν° λΈλ리μ€νΈλ₯Ό μ¬μ©νλ λ°©λ²μ λλ€.
νμνν΄μ ν΄λΉ ν ν°μ Redis μ κ°μ μ€ν 리μ§μ μ μ₯μμΌμ ν ν°μ κ°μ§κ³ μλΉμ€μ μ κ·Όν λ ν΄λΉ ν ν°μ΄ λΈλ리μ€νΈμ λ€μ΄κ°μλμ§ νμΈμ νλ κ³Όμ μ κ±°μΉλ κ²μ λλ€. νμ§λ§ μ΄λ μ¬μ€ JWT μ μλ²μ μνλ₯Ό μ μ₯νμ§ μκ³ λ μΈμ¦ν μ μλ 무μν λ°©μμ μ΄μ μ μ½νμν΅λλ€.
3. `refresh Token` μ μ΄μ©ν΄μ `access Token` μ μ ν¨μκ°μ μ΅μνμΌλ‘ μ€μ΄κ³ κ·Έ 짧μ μκ°λμμ μ¬μ©μμ μ κ·Όμ λν΄μλ ννμ 보λ λ°©λ²μ λλ€.
π‘ [μ€μ μ¬λ‘ μ‘°μ¬]
π± Google
λ°©λ²: OAuth 2.0 λ° OpenID Connect
- ν ν° κ΅¬μ‘°: Googleμ OAuth 2.0μ μ¬μ©νμ¬ μ¬μ©μ μΈμ¦μ μ²λ¦¬ν©λλ€. μ¬μ©μκ° λ‘κ·ΈμΈνλ©΄ μ‘μΈμ€ ν ν°κ³Ό 리νλ μ ν ν°μ΄ λ°κΈλ©λλ€.
- μ ν¨ κΈ°κ°: μ‘μΈμ€ ν ν°μ λ³΄ν΅ 1μκ° λμ μ ν¨νλ©°, 리νλ μ ν ν°μ μ¬μ©μκ° λͺ μμ μΌλ‘ λ‘κ·Έμμνκ±°λ κ³μ μ μμ ν λκΉμ§ μ ν¨ν©λλ€.
- νμ νν΄ μ²λ¦¬:
- μ¬μ©μκ° κ³μ μ μμ νλ©΄, Googleμ ν΄λΉ κ³μ κ³Ό μ°κ²°λ λͺ¨λ μ‘μΈμ€ ν ν°μ 무ν¨νν©λλ€. μ΄ κ³Όμ μμ Googleμ λ΄λΆμ μΌλ‘ μνλ₯Ό κ΄λ¦¬νμ¬, νν΄λ κ³μ μ λν λͺ¨λ μΈμ μ 보λ₯Ό μ κ±°ν©λλ€.
- μ¬μ©μ κ³μ μ΄ μμ λλ©΄, ν΄λΉ μ¬μ©μλ‘λΆν°μ λͺ¨λ μμ²μ "κΆνμ΄ μμ" μλ¬(HTTP 401)λ₯Ό λ°ννκ² λ©λλ€. μ΄λ μ¬μ©μκ° λ μ΄μ μλΉμ€μ μ κ·Όν μ μλλ‘ νλ μ‘°μΉμ λλ€.
- λΉμ¦λμ€ μν₯: μ΄λ¬ν λ°©μμ μ¬μ©μμ κ°μΈ μ 보 보νΈμ 보μμ κ·Ήλννλ©°, μ¬μ©μκ° μνμ§ μλ μν©μμμ λ°μ΄ν° μ κ·Όμ λ°©μ§ν©λλ€. μλ₯Ό λ€μ΄, μ¬μ©μκ° Google κ³μ μ μμ ν νμλ κ·Έ κ³μ μΌλ‘ Google Driveμ μ μ₯λ νμΌμ΄λ Gmailμ μ¬μ©ν μ μκ² λ©λλ€.
π±κ΅¬κΈμ νμ νν΄ μ²λ¦¬ λ°©λ²
1. μ¬μ©μ νν΄ μμ²
- μ¬μ©μ μΈν°νμ΄μ€: κ΅¬κΈ κ³μ μ€μ μμ μ¬μ©μλ "λ΄ κ³μ " νμ΄μ§λ₯Ό ν΅ν΄ κ³μ μ μμ ν μ μλ μ΅μ μ μ°Ύμ μ μμ΅λλ€. μ΄ κ³Όμ μμ μ¬μ©μλ κ³μ μμ μ κ²°κ³Όμ κ·Έλ‘ μΈν μν₯μ λν κ²½κ³ λ©μμ§λ₯Ό λ°μ΅λλ€.
2. κ³μ μμ κ³Όμ
- μΈμ¦ κ³Όμ : μ¬μ©μκ° κ³μ μ μμ νκΈ°λ‘ κ²°μ νλ©΄, ꡬκΈμ 보μμ μν΄ μΆκ°μ μΈ μΈμ¦ κ³Όμ μ μꡬν©λλ€. μ΄λ λΉλ°λ²νΈ μ λ ₯μ΄λ μ΄μ€ μΈμ¦ λ°©λ²μ ν΅ν΄ μ΄λ£¨μ΄μ§λλ€.
- μμ νλ‘μΈμ€ μμ: μΈμ¦μ΄ μλ£λλ©΄, ꡬκΈμ μ¬μ©μμ κ³μ κ³Ό κ΄λ ¨λ λͺ¨λ λ°μ΄ν°λ₯Ό μμ νλ νλ‘μΈμ€λ₯Ό μμν©λλ€.
3. ν ν° λ¬΄ν¨ν
- μ‘μΈμ€ ν ν°κ³Ό 리νλ μ ν ν°: μ¬μ©μκ° κ³μ μ μμ νλ©΄, κ·Έ κ³μ μ λ°κΈλ λͺ¨λ μ‘μΈμ€ ν ν°κ³Ό 리νλ μ ν ν°μ΄ μ¦μ 무ν¨νλ©λλ€. μ΄λ μ¬μ©μκ° λ μ΄μ κ΅¬κΈ APIμ μ κ·Όν μ μλλ‘ νκΈ° μν μ‘°μΉμ λλ€.
- μΈμ μ’ λ£: ꡬκΈμ μλ²μμ μ¬μ©μμ λͺ¨λ μΈμ μ μ’ λ£μν€κ³ , ν΄λΉ μ¬μ©μμ μμ²μ μ²λ¦¬νλ λͺ¨λ λ°±μλ μλΉμ€μμ λ μ΄μ ν΄λΉ μ¬μ©μλ‘λΆν°μ μμ²μ νμ©νμ§ μλλ‘ μ€μ ν©λλ€.
4. λ°μ΄ν° μμ λ° λ³΄κ΄
- λ°μ΄ν° μμ : μ¬μ©μμ κ³μ κ³Ό κ΄λ ¨λ λͺ¨λ λ°μ΄ν°(μ: Gmail, Google Drive, Google Photos λ±)λ μμ λ©λλ€. ꡬκΈμ μ΄ λ°μ΄ν°λ₯Ό μꡬμ μΌλ‘ μμ νκΈ° μν΄ μ¬λ¬ λ¨κ³λ₯Ό κ±°μΉ©λλ€.
- λ°±μ λ° λ³΄κ΄: ꡬκΈμ λ°μ΄ν° μμ μ μ± μ λ°λΌ, μ¬μ©μμ λ°μ΄ν°λ μΌμ κΈ°κ° λμ λ°±μ μμ€ν μ μ μ₯λ μ μμ΅λλ€. κ·Έλ¬λ μ΄ λ°μ΄ν°λ κ³μ μμ μμ²μ΄ μμ ν νΉμ κΈ°κ°μ΄ μ§λλ©΄ μλμΌλ‘ μμ ν μμ λ©λλ€. ꡬκΈμ μ΄ κ³Όμ μμ λ°μ΄ν° λ³΄νΈ λ° λ³΄μμ μ°μ μν©λλ€.
5. μ¬μ©μ μν λ°μ
- API νΈμΆ μ°¨λ¨: κ³μ μμ μ΄ν μ¬μ©μκ° κΈ°μ‘΄μ λ°κΈλ ν ν°μ μ¬μ©νμ¬ APIλ₯Ό νΈμΆνλ©΄, ꡬκΈμ ν΄λΉ νΈμΆμ μ°¨λ¨νκ³ "κΆν μμ" λλ "μ¬μ©μ μμ" μλ¬λ₯Ό λ°νν©λλ€. μ΄λ λ μ΄μ ν΄λΉ κ³μ μ΄ μ ν¨νμ§ μμμ λͺ νν λνλ λλ€.
- μ¬μ¬μ© λ°©μ§: κΈ°μ‘΄μ λ°κΈλ ν ν°μ΄ μ¬μ©μ μνλ₯Ό λ°μνλλ‘ μ€κ³λμ΄, μμ λ κ³μ μ ν ν°μ μ΄λ ν μλΉμ€μλ μ¬μ©λ μ μμ΅λλ€.
6. μ¬μ©μ μλ΄
- νν΄ ν μλ΄: κ³μ μμ κ° μλ£λλ©΄, ꡬκΈμ μ¬μ©μμκ² κ³μ μ΄ μμ λμμμ μλ¦¬κ³ , λ°μ΄ν°κ° μ΄λ»κ² μ²λ¦¬λμλμ§μ λν μ 보λ₯Ό μ 곡ν©λλ€. μ΄λ μ¬μ©μμκ² ν¬λͺ μ±μ μ 곡νκ³ , μ¬μ©μκ° μμ μ κ²°μ μ λν΄ νμ μ κ°μ§ μ μλλ‘ ν©λλ€.
κ²°λ‘
ꡬκΈμ νμ νν΄ μ²λ¦¬ κ³Όμ μμ μ¬μ©μ λ°μ΄ν°λ₯Ό 보νΈνκ³ , λ μ΄μ μλΉμ€μ μ κ·Όν μ μλλ‘ νλ μ‘°μΉλ₯Ό μ·¨ν¨μΌλ‘μ¨, μ¬μ©μμκ² λμ μμ€μ 보μμ μ 곡ν©λλ€. μ΄ κ³Όμ μ μ¬μ©μμ κΆλ¦¬λ₯Ό μ‘΄μ€νκ³ , λ°μ΄ν° λ³΄νΈ λ²κ·λ₯Ό μ€μνλ λ°©ν₯μΌλ‘ μ§νλ©λλ€.
π±κ΅¬κΈμ ν ν° μ¬μ©κ³Ό λΈλ리μ€νΈ
ꡬκΈκ³Ό κ°μ λκ·λͺ¨ μλΉμ€λ μ¬μ©μ κ³μ μ 보μκ³Ό 무결μ±μ μ μ§νκΈ° μν΄ JWTμ λΈλ리μ€νΈλ₯Ό κ΄λ¦¬νλ λ°©μμ μ¬μ©ν©λλ€. μ΄λ JWTμ μν λΉμ μ₯μ±(stateless)μ΄λΌλ λ³Έλμ μ₯μ μ μΌλΆ ν¬μνλ κ²μ΄μ§λ§, λ€μκ³Ό κ°μ μ΄μ λ‘ νμν©λλ€:
1. μ¬μ©μ 보μ κ°ν
- μ¦κ°μ μΈ λΉνμ±ν: μ¬μ©μκ° κ³μ μ νν΄νκ±°λ 보μ μ¬κ³ κ° λ°μνμ λ, λΈλ리μ€νΈλ₯Ό ν΅ν΄ μ¦μ ν΄λΉ μ¬μ©μμ λͺ¨λ 리νλ μ ν ν°μ΄λ μ‘μΈμ€ ν ν°μ λΉνμ±νν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ μ¬μ©μ μ 보μ 리μμ€λ₯Ό 보νΈν μ μμ΅λλ€.
2. λΉμ μμ μΈ νλ λμ
- μ¬μ©μ νλ λͺ¨λν°λ§: λΉμ μμ μΈ νλμ΄ κ°μ§λλ©΄, νΉμ μ¬μ©μμ μΈμ μ΄λ ν ν°μ λΈλ리μ€νΈμ μΆκ°νμ¬ μΆκ°μ μΈ νΌν΄λ₯Ό μλ°©ν μ μμ΅λλ€. μλ₯Ό λ€μ΄, μ¬λ¬ κΈ°κΈ°μμμ μμ¬μ€λ¬μ΄ λ‘κ·ΈμΈ μλκ° μμ κ²½μ° ν΄λΉ μ¬μ©μμ μΈμ¦ μ 보λ₯Ό μ¦μ 무ν¨ννλ κ²μ΄ κ°λ₯ν©λλ€.
3. μλΉμ€ λ¬΄κ²°μ± μ μ§
- μλΉμ€ νμ§ λ³΄μ₯: λΈλ리μ€νΈλ₯Ό ν΅ν΄ νΉμ μ¬μ©μλ‘λΆν°μ λΉμ μμ μΈ μμ²μ΄λ 곡격μ μ°¨λ¨ν¨μΌλ‘μ¨, μ 체 μλΉμ€μ νμ§κ³Ό μμ μ±μ μ μ§ν μ μμ΅λλ€. μ΄λ μλΉμ€μ λν μ λ’°μ±μ λμ΄λ λ° κΈ°μ¬ν©λλ€.
4. λ²μ λ° κ·μ μ€μ
- κ°μΈ μ 보 λ³΄νΈ λ²κ· μ€μ: λ§μ κ΅κ°μμ κ°μΈμ 보 보νΈλ²μ΄ κ°νλ¨μ λ°λΌ, κΈ°μ μ μ¬μ©μ λ°μ΄ν°λ₯Ό μμ νκ² μ²λ¦¬νκ³ , μ¬μ©μκ° μν κ²½μ° ν΄λΉ λ°μ΄ν°λ₯Ό μμ ν μ μλ κΈ°λ₯μ μ 곡ν΄μΌ ν©λλ€. λΈλ리μ€νΈλ₯Ό μ¬μ©νλ©΄ μ΄λ¬ν λ²μ μꡬ μ¬νμ μΆ©μ‘±νλ λ° λμμ΄ λ©λλ€.
π‘ [μ±ν]
λΆλͺ ν ν° λΈλ리μ€νΈλ₯Ό μ¬μ©νλ κ²μ JWT ν ν°μ 무μν μ΄μ μ μ€μΈλ€.νμ§λ§ μ¬μ©μ 보νΈμ μλΉμ€ 무결μ±μ μ μ§νλ λ° νμμ μ΄λ€.κ·Έλ¬λ―λ‘ ν ν° λΈλ리μ€νΈμ μ μ ν μ‘μΈμ€ν ν°, 리νλ μ ν ν° μ ν¨μκ°μ μ€μ ν΄ λ³΄μμ μ κ²½μ°λ κ²μ΄ μ’μ보μΈλ€λ μκ°μ΄ λ λ€.