인증번호 발급

Gunjoo Ahn·2022년 11월 27일
0

회고

목록 보기
6/11
post-thumbnail
post-custom-banner

인증번호를 통한 인증

POS 모바일 어플리케이션 서버의 로그인 서비스와 함께 휴대폰이나 이메일로 사용자 인증을 하는 서비스를 개발하게 되었다. 휴대폰이나 이메일로 인증번호를 발송하여 해당 인증번호를 입력하면 사용자 인증이 되어 회원가입, ID 조회, PW 초기화 서비스를 이용할 수 있도록 하였다.

인증을 위한 로직들

인증번호 인증과정은 다른 서비스들을 보면 참고할 로직들이 정말 다양하고 많다. 그 중 참고한 로직은 인증번호는 최신에 발급한 인증번호만 유효하다는 로직과 인증번호 유효기간 설정 로직이었다. 인증이 완료된 인증번호를 다시 사용하지 못하게 하는 로직도 잊지 않고 구현하였다.

위 로직들을 위하여 아래와 같은 객체를 Redis에 저장하여 인증번호관리를 하였다.

@RedisHash(value = "cert_info")
public class CertificationInfo {
	@Id
	String certificationId;

	String certNumber;
	Long expiredTime;

	boolean certified;
	Long certifyExpiredTime;

	// Enum ACTIVE, INACTIVE 최신에 발급한 인증번호만 ACTIVE
    // 인증이 완료되면 INACTIVE
	CertificationStatus status;
}

인증 과정

사용자가 인증번호를 요청하게 되면 앞에서 언급한 인증 인스턴스를 생성하여 Redis에 저장한다. 생성된 인스턴스에는 인스턴스 아이디, 인증번호, 인증번호 만료시간이 초기에 적재되어있다. 이후 이메일이나 휴대폰 SMS 전송 서비스를 통하여 인증번호를 사용자에게 전송한다.

사용자는 받은 인증번호를 가지고 인증을 요정하게 된다. 인증에 성공하면 Redis에 저장된 인증 인스턴스에 certified 변수를 true로 하면서 인증되었다 체크한다. 그리고 사용자에게 처음 응답했던 인증 인스턴스 아이디가 인증되었다 응답을 마지막으로 보내는 것으로 인증번호 인증이 완료된다.

certifyExpiredTime을 둔 이유는 인증이 완료되었어도 일정 시간 이후에는 해당 인증 정보를 사용하지 못하게 하기위한 보안적인 이유이다.

돌아보며

SMS, 이메일 인증 말고 통신사 인증 서비스를 이용할 수도 있다는 기획팀의 이야기가 있어 인증 로직을 선택하여 인증할 수 있도록 추상화하여 분리하였다.

통신사 인증 서비스의 경우 인증 되었다는 응답을 직접 서버로 주었던 것으로 기억한다. 따라서 SMS나 이메일을 통한 인증이 아니기에 인증 인스턴스에 인증번호 발급은 하지않고 통신사 인증이 완료되면 바로 인증 인스턴스에 인증되었다 체크하고 인증 응답을 사용자에게 전달하는 로직으로 구현하였다.

인증은 다양한 방식으로 진행할 수 있기에 다양한 인증방식을 취사선택할 수 있도록 소프트웨어 설계를 하는 재미가 있었다. 혼자서 설계 및 구현을 하다보니 실제 다른 서비스에서는 어떻게 구현하고 설계되어 있는지 코드 레벨에서 볼 기회가 있다면 꼭 한번 보고 싶다.

profile
Backend Developer
post-custom-banner

0개의 댓글