λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

개발

ν˜‘λ ₯, μ±…μž„, μ—­ν• 

객체지ν–₯의 ν•΅μ‹¬μ΄μž 꽃은 ν˜‘λ ₯, μ±…μž„, 역할이닀.

객체지ν–₯은 κ°μ²΄λ“€μ΄ κ°μžμ˜ μ±…μž„μ„ κ°€μ§€κ³  λ©”μ‹œμ§€λ₯Ό μ£Όκ³ λ°›μœΌλ©° ν˜‘λ ₯ν•¨μœΌλ‘œμ¨ ν•˜λ‚˜μ˜ μœ κΈ°μ μΈ μ‹œμŠ€ν…œμ„ μ΄λ£¨λŠ” λ°©μ‹μ΄λ‹€.

이λ₯Ό μ„€λͺ…ν•˜κΈ° μœ„ν•΄ μ±…μž„μ΄λΌλŠ” κ°œλ…μ—μ„œλΆ€ν„° μ΄μ•ΌκΈ°λ₯Ό μ‹œμž‘ν•΄λ³΄μž.
μ±…μž„μ€ μ–΄λ–€ κ°μ²΄ ν˜Ήμ€ μ—­ν• μ΄ μˆ˜ν–‰ν•΄μ•Ό ν•  μΌμ΄λ‚˜ μ˜λ¬΄λ₯Ό μ˜λ―Έν•œλ‹€.
객체지ν–₯ μ„€κ³„λŠ” μ‹œμŠ€ν…œμ΄ μ œκ³΅ν•΄μ•Ό ν•  μš”κ΅¬μ‚¬ν•­μ„ μ‹œμŠ€ν…œμ˜ μ±…μž„μœΌλ‘œ λ°”λΌλ³΄λŠ” κ²ƒμ—μ„œ μΆœλ°œν•œλ‹€.

예λ₯Ό λ“€μ–΄ ‘μΉ˜ν‚¨μ„ λ¨ΉλŠ”λ‹€’λΌλŠ” μš”ꡬ사항이 μžˆλ‹€κ³  ν•΄λ³΄μž.
이λ₯Ό ν•˜λ‚˜μ˜ κ°μ²΄κ°€ μ•„λ‹ˆλΌ ‘μ§‘’μ΄λΌλŠ” μ‹œμŠ€ν…œμ΄ κ°€μ Έμ•Ό ν•  μ±…μž„μœΌλ‘œ λ°”라본닀.

이 μ±…μž„μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ μ‹œμŠ€ν…œμ€ ‘μΉ˜ν‚¨μ„ 먹어라’λΌλŠ” λ©”μ‹œμ§€λ₯Ό μ •μ˜ν•  수 μžˆλ‹€.
κ·Έλ ‡λ‹€λ©΄ μ΄ λ©”μ‹œμ§€λ₯Ό μˆ˜ν–‰ν•˜κΈ°μ— μ ν•©ν•œ κ°μ²΄λŠ” λ¬΄μ—‡μΌκΉŒ?

λ°”λ‘œ ‘λ‚˜’이닀.

ν•˜μ§€λ§Œ λ‚΄κ°€ μΉ˜ν‚¨μ„ λ¨ΉκΈ° μœ„ν•΄μ„œλŠ” μ—¬λŸ¬ κ°€μ§€ ν•˜μœ„ μž‘업이 ν•„μš”ν•˜λ‹€.
- μΉ˜ν‚¨μ„ μ‹œν‚¨λ‹€
- μΉ˜ν‚¨κ°’을 λ‚Έλ‹€
- μΉ˜ν‚¨μ„ λ°›λŠ”λ‹€

이 μ‹œμ μ—μ„œλŠ” μ•„직 κ° μž‘업을 λˆ„κ°€ μˆ˜ν–‰ν• μ§€λŠ” μ •ν•΄μ§€μ§€ μ•Šμ•˜λ‹€.
λ‹€λ§Œ μ±…μž„μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ λ©”μ‹œμ§€λ“€μ΄ μ‹λ³„λ˜μ—ˆμ„ 뿐이닀.

이제 κ° λ©”μ‹œμ§€λ₯Ό κ°€μž₯ μž˜ μ²˜λ¦¬ν•  μˆ˜ μžˆλŠ” κ°μ²΄ ν˜Ήμ€ μ—­ν• μ„ μƒκ°ν•΄λ³Ό μˆ˜ μžˆλ‹€.
- μΉ˜ν‚¨μ„ μ‹œν‚€λŠ” μ±…μž„ → νœ΄λŒ€ν°
- μΉ˜ν‚¨κ°’μ„ λ‚΄λŠ” μ±…μž„ → 톡μž₯
- μΉ˜ν‚¨μ„ λ°›λŠ” μ±…μž„ → λ¬Έ

μ΄λ ‡κ²Œ ‘μΉ˜ν‚¨μ„ λ¨ΉλŠ”λ‹€’λΌλŠ” ν•˜λ‚˜μ˜ 큰 μ±…μž„μ€ μ—¬λŸ¬ 개의 μž‘μ€ μ±…μž„μœΌλ‘œ λΆ„ν•΄λ˜κ³ ,
각 μ±…μž„μ΄ μ μ ˆν•œ κ°μ²΄(ν˜Ήμ€ μ—­ν• )에 ν• λ‹Ήλ˜λ©΄μ„œ κ°μ²΄λ“€μ΄ λ©”μ‹œμ§€λ₯Ό ν†΅ν•΄ μƒν˜Έμž‘μš©ν•˜λŠ” ν˜‘λ ₯ κ΄€κ³„κ°€ μ™„μ„±λœλ‹€.

즉, κ°μ²΄μ§€ν–₯ μ„€κ³„μ—μ„œ μ€‘μš”ν•œ κ²ƒμ€ ν˜‘λ ₯을 λ¨Όμ € λ– μ˜¬λ¦¬κ³ , κ·Έ ν˜‘λ ₯을 κ°€λŠ₯ν•˜κ²Œ ν•˜λŠ” μ±…μž„κ³Ό μ—­ν• μ„ μ˜¬λ°”λ₯΄κ²Œ μ„€μ •ν•˜λŠ” κ²ƒμ΄λ‹€. μ—¬κΈ°μ„œ ν˜‘λ ₯을 λ¨Όμ € λ– μ˜¬λ¦¬λΌλŠ” λ§μ€ λ§ˆμΉ˜ μœ„μ˜ λ§μ„ λΆ€μ •ν•˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μΈλ‹€. ν•˜μ§€λ§Œ, μ—¬κΈ°μ—” μ€‘μš”ν•œ ν¬μΈνŠΈκ°€ ν•˜λ‚˜μžˆλ‹€.

섀계λ₯Ό μ‹œμž‘ν•˜κΈ° μ „, ν˜‘λ ₯의 ν° κ·Έλ¦Όμ„ ν•œλ²ˆ κ·Έλ €λ³΄λŠ” κ²ƒμ΄λ‹€.
κ°„λ‹¨ν•œ μ˜ˆμ‹œλ‘œ μ΄λ₯Ό μ΄ν•΄ν•΄λ³΄μž.

아침에 μΌμ–΄λ‚˜ μΆœκ·Ό μ€€λΉ„λ₯Ό ν•œλ‹€κ³ ν•˜λ©΄, κ°€μž₯ λ¨Όμ € λ– μ˜€λ₯΄λŠ” μƒκ°μ΄ λ¬΄μ—‡μΈκ°€?
"μΌμ–΄λ‚˜μžλ§ˆμž λ°₯ λ¨Ήκ³  μ”»κ³ λ‚˜μ„œ μ˜· μž…κ³ .."와 κ°™μ΄ μ•„μΉ¨ μΆœκ·Ό μ€€λΉ„μ˜ νλ¦„을 μƒκ°ν•˜κ²Œ λ  κ²ƒμ΄λ‹€.

μ—¬κΈ°μ„œ "λ‚˜λŠ” μ„Έμˆ˜, λ°₯ λ¨ΉκΈ°, μ”»κΈ°, μ˜· μž…κΈ°λ₯Ό ν•΄μ•Όμ§€"와 μ²˜λŸΌ μ±…μž„μ˜ λ‚˜μ—΄μ„ ν•˜μ§„ μ•Šμ„ κ²ƒμ΄λ‹€. 
이처럼 μ•„μΉ¨ μ€€λΉ„λΌλŠ” ν° μ±…μž„ μ•„λž˜ '흐름' μ¦‰, ν˜‘λ ₯을 λ¨Όμ € μƒκ°ν•˜κΈ°μ— κ°μ²΄μ§€ν–₯ μ„€κ³„ μ—­μ‹œ μ±…μž„μ„ μ •μ˜ν•˜κΈ° μ „에, κ·Έ μ±…μž„μ΄ μ–΄λ–»κ²Œ λ‹¬μ„±λ μ§€μ— λŒ€ν•œ ν˜‘λ ₯의 νλ¦„을 ν° κ·Έλ¦ΌμœΌλ‘œ κ·Έλ €λ³΄κ³  μ‹œμž‘ν•˜λŠ” κ²ƒμ΄ μ€‘μš”ν•˜λ‹€.

즉, μ±…μž„μ€ μ„€κ³„μ˜ κΈ°μ€€μ΄κ³ , ν˜‘λ ₯은 κ·Έ μ±…μž„μ„ μ˜¬λ°”λ₯΄κ²Œ λ‚˜λˆ„κΈ° μœ„ν•œ μ‚¬κ³ μ˜ ν‹€μ΄λ‹€.

κ·Έλ ‡λ‹€λ©΄ μ—¬κΈ°μ„œ μ—­ν• μ€ λ¬΄μ—‡μΌκΉŒ?

역할은 μ—°κ·Ήμ˜ λ°°μ—­μ„ μƒκ°ν•˜λ©΄ μ‰½λ‹€. 
μ—°κ·Ήμ—μ„œ μ–΄λ–€ λ°°μ—­μ΄ μžˆμ„ λ•Œ ν•­μƒ ν•œ λͺ…μ˜ λ°°μš°λ§Œ λ°°μ—­μ„ λ§‘μ§€λŠ” μ•ŠλŠ”λ‹€. 
μ–΄λ–€ λ‚ μ€ A λ°°μš°κ°€ λ§‘을 μˆ˜λ„ μžˆκ³ , μ–΄λ–€ λ‚ μ€ B λ°°μš°κ°€ λ§‘을 μˆ˜λ„ μžˆλ‹€. μ΄μ²˜λŸΌ ν˜‘λ ₯μ΄λΌλŠ” κ΄€κ³„ μ†μ—μ„œ κ°™μ€ μ±…μž„μ„ μˆ˜ν–‰ν•  μˆ˜ μžˆλ‹€λ©΄ λ°°μš°κ°€ λˆ„ꡬ든 'λ°°μ—­'μ΄λΌλŠ” ν•˜λ‚˜μ˜ μ—­ν• λ‘œ λ³Ό μˆ˜ μžˆλ‹€.


단지, μ—°κ·Ήμ΄λΌλŠ” ν˜‘λ ₯ μ•„λž˜ μ£Όμ–΄μ§„ μ—­ν• μ„ μž˜ μˆ˜ν–‰ν•˜κΈ°λ§Œ ν•˜λ©΄ λœλ‹€.

이처럼 역할은 좔상화λ₯Ό λ§Œλ“€μ–΄λ‚΄λŠ” μ€‘μš”ν•œ μš”μ†Œμ΄λ‹€.
μœ„μ˜ μ—°κ·Ή μ˜ˆμ‹œμ—μ„œ λ°°μ—­μ΄ μ•„λ‹Œ A λ°°μš°λ‘œ κ³ μ •ν•œλ‹€κ³  ν•΄λ³΄μž. λ§Œμ•½, A λ°°μš°κ°€ μ•„ν”„λ‹€λ©΄ ν•΄λ‹Ή λ°°μš°κ°€ λ‚˜μ„λ•ŒκΉŒμ§€ μ—°κ·Ήμ„ μ€‘단해야 ν• κΉŒ? ν˜„μ‹€ μ„Έκ³„μ—μ„œλŠ” κ·ΈλŸ΄μ§€λ„ λͺ¨λ₯΄μ§€λ§Œ, λ‹¨μˆœν•˜κ²Œ μƒκ°ν•˜λ©΄ λ‹€λ₯Έ λ°°μš°λ₯Ό νˆ¬μž…ν•˜λ©΄ λœλ‹€. ν•΄λ‹Ή λ°°μš°κ°€ λ°°μ—­μ„ μž˜ μˆ˜ν–‰ν•œλ‹€λ©΄ μ „ν˜€ λ¬Έμ œκ°€ μ—†λ‹€.

이처럼 ν•˜λ‚˜μ˜ κ°μ²΄λ‘œ λ³΄λ˜ κ²ƒμ„ μ—­ν• λ‘œμ„œ λ°”라본닀면, ν•΄λ‹Ή μ—­ν• λ§Œ μž˜ μˆ˜ν–‰ν•˜λŠ” κ°μ²΄λ©΄ λ˜κΈ°μ— λ³€κ²½κ³Ό ν™•μž₯에 μœ μ—°ν•΄μ§„λ‹€. μ¦‰, μ—­ν• μ€ ν˜‘λ ₯ κ΄€κ³„μ—μ„œ κ΅¬μ„± μš”μ†Œλ₯Ό μΆ”상화 ν•  μˆ˜ μžˆλ‹€λŠ” κ²ƒμ΄λ‹€. κ·Έλ ‡κΈ°μ— ν˜‘λ ₯의 κ΄€μ μ—μ„œ μΆ”μƒν™”μ˜ μ΄μ μ„ μ–»μ–΄κ°ˆ μˆ˜ μžˆλ‹€.
ν•˜μ§€λ§Œ, μ„€κ³„ μ΄ˆκΈ°μ—λŠ” μ΄λŸ¬ν•œ μ—­ν• μ΄ μž˜ λ³΄μ΄μ§€ μ•Šμ„ μˆ˜ μžˆλ‹€. κ·Έλ¦¬κ³  ν•˜λ‚˜μ˜ κ°μ²΄λ§Œ ν˜‘λ ₯ μ•ˆμ—μ„œ μ±…μž„μ„ μˆ˜ν–‰ν•˜λŠ”κ²Œ λͺ…ν™•ν•  λ•Œλ„ λΆ„λͺ…μžˆλ‹€.

μ΄λŸ¬ν•œ κ²½μš°μ—λŠ” ν•΄λ‹Ή κ°μ²΄λ₯Ό μ—­ν• λ‘œ λ³΄μ•„도 λ¬΄λ°©ν•˜λ‹€. μ—¬κΈ°μ„œ μž¬λ°ŒλŠ” μ μ€ μ±…μž„μ΄ μ—­ν• μ„ κ²°μ •ν•œλ‹€λŠ” μ‚¬μ‹€μ΄λ‹€. κ·Έλ ‡κΈ°μ— κ°μ²΄λŠ” μ—¬λŸ¬ μ—­ν• μ„ κ°€μ§ˆ μˆ˜ μžˆλ‹€. λ‹€λ§Œ, ν•˜λ‚˜μ˜ ν˜‘λ ₯에 μ°Έμ—¬ν•œ κ°μ²΄λŠ” μ–Έμ œλ‚˜ ν•˜λ‚˜μ˜ μ—­ν• μ„ κ°€μ§„λ‹€.

κ²°κ΅­ 객체지ν–₯ μ„€κ³„λž€, 무엇을 ν•΄μ•Ό ν•˜λŠ”κ°€(μ±…μž„) λ₯Ό κΈ°μ€€μœΌλ‘œ μ–΄λ–»κ²Œ ν•¨κ»˜ 일할지(ν˜‘λ ₯) λ₯Ό 그렀보고, λˆ„κ°€ κ·Έ 일을 맑을 수 μžˆλŠ”μ§€(μ—­ν• ) λ₯Ό μœ μ—°ν•˜κ²Œ λ°°μΉ˜ν•˜λŠ” 과정이닀.

 

이런 κ΄€μ μ—μ„œ 문득 ν”„λ‘œμ νŠΈμ—μ„œ μž‘μ„±ν•œ 토큰 검증 과정이 생각났닀.

 

public String validateAndGetUserId(SecretKey key) {  
    try {  
        Claims claims = Jwts.parser()  
                .verifyWith(key)  
                .build()  
                .parseSignedClaims(accessToken)  
                .getPayload();  
        return claims.getSubject();  
    } catch (JwtException e) {  
        throw AUTHENTICATION_FAIL.create();  
    }  
}
@Override  
public OauthUserInfo verifyAndGetUserInfo(Provider provider, String idToken) {  
    NimbusOidcIdTokenProcessor processor = processors.get(provider);  
    if (processor == null) throw new IllegalArgumentException("μ§€μ›ν•˜μ§€ μ•ŠλŠ” provider: " + provider);  
  
    JWTClaimsSet claims = processor.verifyAndGetClaims(idToken);  
    String providerId = claims.getSubject();  
    String email = safeString(claims, "email");  
    String picture = safeString(claims, "picture");  
  
    return new OauthUserInfo(providerId, email, picture);  
}


μ§„ν–‰ 쀑인 두 ν”„λ‘œμ νŠΈμ—μ„œ κ°€μ Έμ˜¨ μ½”λ“œμΈλ°, μ•½κ°„μ˜ μ°¨μ΄λŠ” μžˆμ§€λ§Œ κ³΅ν†΅μ μœΌλ‘œ 토큰을 κ²€μ¦ν•˜κ³ , 토큰 내에 μ‘΄μž¬ν•˜λŠ” μœ μ €μ˜ 정보λ₯Ό κ°€μ Έμ˜¨λ‹€.

μ—¬κΈ°μ„œ ν•΄λ‹Ή λ©”μ„œλ“œλŠ” μ΄λ‘ μ μœΌλ‘œ λ‘ κ°œμ˜ λ©”μ‹œμ§€λ₯Ό μ²˜λ¦¬ν•œλ‹€κ³  λ³Ό μˆ˜ μžˆμ„ κ²ƒ κ°™λ‹€.
- ν† ν°μ„ κ²€μ¦ν•˜λΌ
- μœ μ € μ •보λ₯Ό κ°€μ Έμ™€λΌ

그렇기에 λ‘ κ°œμ˜ λ©”μ‹œμ§€λ₯Ό ν•˜λ‚˜μ˜ λ©”μ„œλ“œκ°€ λ‹΄λ‹Ήν•œλ‹€κ³  λ³Ό μˆ˜ μžˆλ‹€. κ·Έλ ‡λ‹€λ©΄ λ‘ κ°œμ˜ λ©”μ‹œμ§€λ‘œ λΆ„λ¦¬ν•˜μ—¬ κ° λ©”μ„œλ“œκ°€ μ²˜λ¦¬ν•˜λ„둝 λ§Œλ“€λ©΄ μ•„λž˜μ™€ κ°™μ€ μ½”λ“œκ°€ λ  κ²ƒμ΄λ‹€.

 

public JwtParser validate(SecretKey key) {  
    try {  
        return Jwts.parser()  
                .verifyWith(key)  
                .build();  
    } catch (JwtException e) {  
        throw AUTHENTICATION_FAIL.create();  
    }  
}  
  
public String getUserId(JwtParser parser) {  
    Claims payload = parser  
            .parseSignedClaims(accessToken)  
            .getPayload();  
  
    return payload.getSubject();  
}
@Override  
public JWTClaimsSet verify(Provider provider, String idToken) {  
    NimbusOidcIdTokenProcessor processor = processors.get(provider);  
    if (processor == null) throw new IllegalArgumentException("μ§€μ›ν•˜μ§€ μ•ŠλŠ” provider: " + provider);  
  
    return processor.verifyAndGetClaims(idToken);  
}  
 
@Override 
public OauthUserInfo getUserInfo(JWTClaimsSet claims) {  
    String providerId = claims.getSubject();  
    String email = safeString(claims, "email");  
    String picture = safeString(claims, "picture");  
  
    return new OauthUserInfo(providerId, email, picture);  
}


이둠적으둜 보면 토큰을 κ²€μ¦ν•œλ‹€μ™€ μœ μ € 정보λ₯Ό κ°€μ Έμ˜¨λ‹€λŠ” μ„œλ‘œ λ‹€λ₯Έ λ©”μ‹œμ§€μ΄λ©°, 각각 λ…λ¦½λœ μ±…μž„μœΌλ‘œ 뢄리할 수 μžˆλ‹€. 그리고 이게 κ°œλ…μ μœΌλ‘œ κΉ”λ”ν•œ λͺ¨μŠ΅μœΌλ‘œ 보인닀.

ν•˜μ§€λ§Œ μ‹€μ œ ν˜‘λ ₯의 κ΄€μ μ—μ„œ 보면 이 두 ν–‰μœ„λŠ” 항상 ν•¨κ»˜ μˆ˜ν–‰λ˜λ©°, λΆ„λ¦¬λœ μƒνƒœλ‘œ μ‚¬μš©λ  μ—¬μ§€κ°€ 거의 μ—†λ‹€. 

즉, 이 경우 두 μ±…μž„μ€ κ°œλ…μ μœΌλ‘œλŠ” 뢄리 κ°€λŠ₯ν•˜μ§€λ§Œ, ν˜‘λ ₯ μ•ˆμ—μ„œλŠ” ν•˜λ‚˜μ˜ 의미 μžˆλŠ” ν–‰μœ„(인증)둜 λ™μž‘ν•œλ‹€.

이런 μƒν™©μ—μ„œ λ©”μ‹œμ§€λ₯Ό μΈμœ„μ μœΌλ‘œ λΆ„λ¦¬ν•˜λ©΄, 였히렀 verify 이후 λ°˜λ“œμ‹œ getUserInfoλ₯Ό ν˜ΈμΆœν•΄μ•Ό ν•œλ‹€λŠ” 암묡적인 ν”„λ‘œν† μ½œμ„ μ½”λ“œ λ°–μ˜ λ§₯락에 μ˜μ‘΄ν•˜κ²Œ λœλ‹€.

μ΄λŠ” ν˜‘λ ₯을 μ½”λ“œλ‘œ λ“œλŸ¬λ‚΄κΈ°λ³΄λ‹€, ν˜‘λ ₯을 개발자의 κΈ°μ–΅κ³Ό ν•©μ˜μ— λ§‘κΈ°λŠ” 섀계가 될 수 μžˆλ‹€.

그렇기에 κ°μ²΄μ§€ν–₯은 μ½”λ“œμ˜ λ°°μΉ˜λ₯Ό λ°°μ œν•˜κ³  μ„€κ³„ν•  μˆ˜ μ—†μœΌλ©°, κ²°κ΅­ ν•΅μ‹¬μ€ μ±…μž„μ„ μ–΄λ–»κ²Œ μ„€μ •ν•˜λŠλƒμ— μžˆλ‹€.