이번 프로젝트에서 보안강화를 위해

otp인증 기능을 만들게 되었는데

소스가.. 너무 안읽혔다...

참고 소스를 보고 개선한 소스를 공유해 본다ㅋ

 

// 참고소스(예시) 로그인 실패 한경우 메세지 설정하는 부분

int errMsgCode = 0;
String loginFlag = "S";
String loginMsg ="";
....

	loginFlag = getAuth();
	if("S".equals(loginFlag)){
    	
        if(로그인 실패건수가 5번 이상인 경우){
        	errMsgCode = 10001;
        }else if(계정이 잠김경우){
        	errMsgCode = 10002;
        }    	
    }else{
    	......
    }
    
    switch(errMsgCode){
    	case 10001:
        	loginFlag = "F";
            errMsg ="로그인 실패건수 5번이상";
        break;
        case 10002:
        	loginFlag = "F";
        	errMsg ="계정잠김 ";
        break;
        
        ... 
        default:
        break;    
    
    }
    
    .. 또 로그인관련 로직

 

솔직히 말하면 진짜 로그인쪽 보면서

직관적인 소스가 중요한지,,

왜 메소드단위로 분리되어야하는지

느꼈다....

 

이 코드를 보다가 error code를

enum으로 따로 만드는게 좋다고 판단해서

LoginLockReason 이라는 Enum을 작성했다.

 

public enum LoginLockReason {
    LDAP_FAILURE("LDAP 인증 실패 5회 연속"),
    OTP_FAILURE("OTP 인증 실패"),
    OTP_REQUEST_LIMIT("1분 안에 OTP 요청 5회 초과");

    private final String message;

    LoginLockReason(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}


.......

 loginLockReason = getLoginLockReason();

 switch(loginLockReason){
    	case LDAP_FAILURE: case OTP_FAILURE: case OTP_REQUEST_LIMIT:
        	loginLockReason.getMessage();
        break;       
        ... 
        default:
        break;
}

 

errorCode 보다 enum이 훨씬 직관적인 소스가 되는것 같다.

errorCode는 주석이 없거나 문서가 없다면 소스를 분석해서

어떤 걸 의미하는지 찾아야한다면 enum은 값자체로도

뭘 의미하는지 잘 알수 있어서 좋았다.

그리고 enum은 code와 msg를 같이 관리해 연관되어 있다는

문맥이 생겨서 enum 클래스 만 보더라도 이해하기 좋을 것 같다.

 

LoginLockReason enum 말고도

이번에 OTP 인증 결과도

OtpAuthResult도 enum으로 만들었는데

 

public enum OtpAuthResult {
    INVALID_OTP("유효하지 않은 OTP입니다."),
    EXPIRED_OTP("만료된 OTP입니다."),
    OTP_ATTEMPTS_EXCEEDED("OTP 시도 횟수가 초과되었습니다."),
    OTP_MISMATCH("OTP가 일치하지 않습니다. 남은 시도 횟수: %d");

    private final String messageTemplate;

    OTPError(String messageTemplate) {
        this.messageTemplate = messageTemplate;
    }

    public String getMessage(Object... params) {
        return String.format(messageTemplate, params);
    }
}

 

다른 곳에서는otp 인증할 때 인증결과를 어떻게 다루는지 궁금하다.

 

 

반응형

+ Recent posts