본문 바로가기
JavaScript

[ JavaScript ] 이메일 인증 화면 예제

by teamnova 2022. 11. 30.

 

 

오늘은 HTML CSS JAVASCRIPT를 사용해서 이메일 인증 화면을 만들어보겠습니다!

 

먼저 예제가 실행된 모습입니다!

유효 시간 변경, 인증코드 정규식 변경을 하면서 활용하시면 될 것 같습니다!

 

 

 

전체 코드입니다!

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    
    <style>

        /* 화면 중앙 요소 정렬 */
        .container{
            display: flex;
            flex-direction: column;
            justify-content: center;
            align-content: center;
            align-items: center;
            
        }

        /* email, auth 공통 컨테이너 설정 */
        .email_container, .auth_container {
            width: 400px;
            padding:16px;
            border: 1px solid gray;
        }

        /* 인증코드 화면 초기화 설정 */
        .auth_container{
            display: none;
        }

        /* 입력창 기본 설정 */
        .input {
            height: 35px;
            width: 270px;
            padding: 8px;
        }

        /* 메세지 기본 설정 */
        .msg{
            font-size: small;
            padding-top: 8px;
            margin: 0;
            display: none;
        }

        /* 인증코드 입력창 + 유효 시간 */
        .input_container{
            position: relative;
            display: inline-block;
        }

        /* 유효시간 타이머 설정 */
        .timer{
            position: absolute;
            right: 16px;
            top:16px;
        }

        /* 인증코드를 받지 못하셨나요?  [인증코드 재발송] */
        .ReRFCBox{
            display: flex;
            justify-content: space-between;
        }
        
        
        /* 버튼 공통 설정 */
        button{
            height:55px;
        }

        /* 이메일 잘못 입력, 이메일 변경 */
        .misspell_box{
            display: flex;
            justify-content: space-between;
            display: none;
        }

        /* 이메일을 잘못 입력하셨나요?, 인증코드를 받지 못하셨나요? 메세지 */
        .misspell_box span, .ReRFCBox > span{
            align-self :center;
        }

        /* 이메일 변경, 인증코드 재발송 */
        .misspell_box > button, .ReRFCBox > button{
            background-color: transparent;
            border: 0;
            outline: 0;
            padding-top: 8px;
            padding-bottom: 8px;
            height: fit-content;
        }
        
    </style>

    <script>

        // 이메일 정규식
        var email_pattern = /^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*.[a-zA-Z]{2,3}$/i;
        var code_pattern = /[0-9]{6,6}/;
        let email_input, RFCBtn, email_msg, misspell_box, email_change_btn;
        let auth_container, code_input, timer, code_msg, code_check, ReRFCBtn;
        let ResponseCode = "";
        
        const border_err_color="red", border_succ_color="gray";
        const msg_err_color = "red", msg_succ_color = "green";
        const input_readonly_color = "#e1e4ee";

        // 코드 유효성 (유효하면 true, 아니면 false)
        let code_valid = false 
        // 발송 후 지난 초
        let current_time = 0;
        // 유효시간 
        let minutes,seconds;
        let timer_thread;

        // 형식 유효성 검사
        function type_validation(pattern,input,msg, success){
            
            // 검사할 입력값
            let value = input.value;
            // 형식 유효성 검사 
            // 형식검사 1. "" 아무것도 입력하지 않았는가?
            if(value.length == 0){
                // 입력창 빨간색 테두리
                input.style.borderColor = border_err_color;
                // 메세지 보임 처리
                msg.style.display = "block"
                // 메세지 실패 색상 설정
                msg.style.color = msg_err_color;
                // 메세지에 이메일을 입력해주세요. 출력
                msg.textContent = "입력해주세요.";
            }
            // 형식검사 2. 정규 표현식을 만족하지 못하는가?
            else if(value.match(pattern) == null){
                // 입력창 빨간색 테두리
                input.style.borderColor = border_err_color;
                // 메세지 보임 처리
                msg.style.display = "block"
                // 메세지 실패 색상 설정
                msg.style.color = msg_err_color;
                // 메세지에 이메일을 입력해주세요. 출력
                msg.textContent = "형식을 다시 확인해주세요.";
            }
            // 형식 유효성 검사 통과
            else{
          
                success();
                
            }

        }

        // 인증코드 유효시간 카운트다운 및 화면 출력
        function timer_start(){

            
            // 인증코드 유효성 true
            code_valid = true;
            // 현재 발송 시간 초기화
            current_time = 0
            // 20초
            let count = 20

            timer.innerHTML = "00:20"
            // 1초마다 실행
            timer_thread = setInterval(function () {
                
                minutes = parseInt(count / 60, 10);
                seconds = parseInt(count % 60, 10);
        
                minutes = minutes < 10 ? "0" + minutes : minutes;
                seconds = seconds < 10 ? "0" + seconds : seconds;
        

                timer.innerHTML  = minutes + ":" + seconds;

                // alert(minutes + ":" + seconds);
                
                // 타이머 끝
                if (--count < 0) {
                    timer_stop();
                    timer.textContent = "시간초과"
                    // code msg 보임
                    code_msg.style.display = "block";
                    // code msg "인증코드가 만료되었습니다."
                    code_msg.textContent = "인증코드가 만료되었습니다.";
                    // 코드 색상 비정상
                    code_msg.style.color = msg_err_color;
                }

                current_time++

            }, 1000);
      
        } 

        // 타이머 종료
        function timer_stop(){
            // 타이머 종료
            clearInterval(timer_thread)
            // 유효시간 만료
    		code_valid = false
        }

        // 인증코드가 유효하면 true, 만료되었다면 false 반환
        function iscodeValid(){

            return code_valid;

        }

        // 인증코드 발송 후 10초가 지났는가? 지났으면 true, 안지났으면 false
        function isRerequest(){

            return  current_time>=10?true:false;

        }
        // 화면이 로드되었을 때 발생하는 이벤트
        window.onload = function(event){

            email_input = document.querySelector(".input_email");
            RFCBtn = document.querySelector(".RFCBtn");
            email_msg = document.querySelector(".email_msg");
            misspell_box = document.querySelector(".misspell_box");
            email_change_btn = document.querySelector(".email_change");

            auth_container = document.querySelector(".auth_container");
            code_input = document.querySelector(".input_auth");
            code_msg = document.querySelector(".auth_msg");
            timer = document.querySelector(".timer");
            code_check = document.querySelector(".AuthBtn");
            ReRFCBtn = document.querySelector(".ReRFCBtn");


            // 이메일 입력창 포커스 얻을 때
            email_input.onfocus = function(e){
                // 이메일을 작성할 수 있을 때
                if(email_input.readOnly == false){
                    // 인증 코드 발송 btn 비활성화
                    RFCBtn.disabled = true;
                    // 이메일 input 테두리 색상 복구
                    this.style.borderColor = border_succ_color;               
                    // 메세지 안보임
                    email_msg.style.display = "none";
                }

            }

            // 이메일 입력창 포커스 잃을 때
            email_input.onblur = function(e){
                
                // 이메일 형식 유효성검사
                type_validation(email_pattern,email_input,email_msg,function(){
                    // 이메일 형식 유효성검사 통과시 실행는 함수
                    
                    // 입력창 정상 테두리
                    email_input.style.borderColor = border_succ_color;
                    // 메세지 보임 처리
                    email_msg.style.display = "block"
                    // 메세지 성공 색상 설정
                    email_msg.style.color = msg_succ_color;
                    // 메세지에 올바른 이메일 형식입니다. 출력되
                    email_msg.textContent = "올바른 이메일 형식입니다.";
                    // 인증 코드 발송 btn 활성화
                    RFCBtn.disabled = false;
                })

            }

            // 인증코드 발송 버튼 클릭시
            RFCBtn.onclick = function(e){

                // 인증코드 발송 처리
                // 발송된 코드 
                ResponseCode = "123456";

                

                // 화면 처리
                // 이메일 입력창 readonly로 변경
                email_input.readOnly = true;
                // 이메일 입력창 색 파란색으로 변경
                email_input.style.backgroundColor = input_readonly_color;
                // 인증코드 발송 버튼 비활
                this.disabled = true;
                // 이메일 misspell box 보임으로 변경
                misspell_box.style.display = "block";
                
                // 타이머 설정 및 화면에 출력
                timer_start();
                
                // auth_box 보임으로 변경
                auth_container.style.display = "block";
                // 인증 msg 인증코드 발송 성공. (10초 뒤부터 재발송 가능합니다.)
                code_msg.textContent = "인증코드 발송 성공. (10초 뒤부터 재발송 가능합니다.)";
                
                // 인증 msg 색 변경
                code_msg.style.color = msg_succ_color;
                // 인증 msg 보임 처리
                code_msg.style.display = "block";
                


            }

            // 이메일 변경 버튼을 클릭할 때
            // 이메일을 잘못 입력해서, 이메일을 변경하고자 함.
            email_change_btn.onclick = function(e){
                // 인증 절차 초기화

                // 인증 코드 만료
                ResponseCode = "";
                // 타이머 종료
                timer_stop();

                // 화면 초기화
                    // auth container 안보임
                    auth_container.style.display = "none";
                    // misspell box 안보임
                    misspell_box.style.display = "none";
                    // 인증코드 btn 활성화
                    RFCBtn.disabled = false;
                    // 이메일 입력창 배경색 흰색으로 변경
                    email_input.style.backgroundColor = "white";
                    // 이메일 입력창 활성화
                    email_input.readOnly = false;

                    // 인증 확인 버튼 비활성화
                    code_check.disabled = true;
            }
            
            
            // 인증코드 입력창 포커스 얻을 때
            code_input.onfocus = function(e){
                // 입력창 정상 테두리
                this.style.borderColor = border_succ_color;
                // msg 제거
                code_msg.style.display = "none";
                // 인증 확인 버튼 비활성화
                code_check.disabled = true;
            }


            // 인증코드 입력창 포커스 잃을 때
            code_input.onblur = function(e){
                
                // 입력한 인증코드의 상태를 검사한다.

                // 1. 인증코드가 만료되었는지 확인
                if(!iscodeValid()){
                    // code 입력창 테두리 빨간색으로 변경
                    code_input.style.borderColor = border_err_color;
                    // code msg 보임
                    code_msg.style.display = "block";
                    // code msg "인증코드가 만료되었습니다."
                    code_msg.textContent = "인증코드가 만료되었습니다.";
                    // 코드 색상 비정상
                    code_msg.style.color = msg_err_color;
                }
                else{
                    // 2. 입력값이 존재하는지 확인
                    // 3. 정규식을 만족하는지 확인

                    type_validation(code_pattern,this,code_msg,function(){
                        // 형식 유효성 검사를 통과했다면

                        // code 입력창 테두리 정상으로 변경
                        code_input.style.borderColor = border_succ_color;
                        // code msg 보임
                        code_msg.style.display = "block";
                        // code msg "올바른 인증코드 형식입니다."
                        code_msg.textContent = "올바른 인증코드 형식입니다.";
                        // 코드 색상 정상
                        code_msg.style.color = msg_succ_color;
                        // 인증 확인 버튼 활성화
                        code_check.disabled = false;
                    })
                }


            }


            // 인증코드 확인 버튼 클릭할 때
            code_check.onclick = function(e){

                // 타이머 시간 초과 확인
                if(iscodeValid()){
                    let code = code_input.value;
                    // 인증코드 일치성 검사 
                    // 통과시
                    if(ResponseCode == code){
                        // code msg "이메일 인증 성공!"
                        code_msg.textContent = "이메일 인증 성공!"
                        // code msg 보임
                        code_msg.style.display = "block";
                        // code msg 색상 정상
                        code_msg.style.color = msg_succ_color;
                    }
                    else{
                        // 미통과
                        // code msg "인증코드가 일치하지 않습니다."
                        code_msg.textContent = "인증코드가 일치하지 않습니다."
                        // code msg 보임
                        code_msg.style.display = "block";
                        // code msg 색상 비정상
                        code_msg.style.color = msg_err_color;
                    }
                }
            }

            // 인증코드 재발송 버튼 클릭할 때
            ReRFCBtn.onclick = function(e){

                // 인증코드 발송 후 10초가 지났는지 확인
                if(isRerequest()){
                    // 인증코드 재발송
                    ResponseCode = "987654"

                    // code msg 인증코드 발송 성공
                    code_msg.textContent = "인증코드 발송 성공. (10초 뒤부터 재발송 가능합니다.)";
                    // code msg 보임
                    code_msg.style.display = "block";
                    // code msg 정상 색
                    code_msg.style.color = msg_succ_color;

                    // code 테두리 색 정상으로 변경
                    code_input.style.borderColor = border_succ_color

                    // 타이머 리셋
                    timer_stop()
                    timer_start()
                }
                else{
                    // code msg 인증코드 발송 거부
                    code_msg.textContent = "인증코드 발송 후 10초 뒤부터 재발송 가능합니다.";
                    // code msg 보임
                    code_msg.style.display = "block";
                    // code msg 정상 색
                    code_msg.style.color = msg_err_color;
                }


            }
    
        }

    </script>
</head>

<body class="container">

    <h1>이메일 인증</h1>

    <!-- 이메일 관련  -->
    <div class="email_container">

        <!-- 이메일 -->
        <div class="email_box">
            <!-- 이메일 입력창 -->
            <input type="text" class="input input_email" placeholder="인증할 이메일을 입력해주세요.">
            <!-- request for code button -->
            <button class="RFCBtn" disabled>인증코드 발송</button>
        </div>

        <!-- msg -->
        <p class="email_msg msg">
            [email 메세지]
        </p>

        <!-- 이메일 변경 -->
        <div class="misspell_box">
            <span>이메일을 잘못 입력하셨나요?</span>
            <button class="email_change">[이메일 변경]</button>
        </div>

    </div>

    <!-- 인증코드 관련 -->
    <div class="auth_container">

        <h3>인증 코드</h3>

        <!-- 인증 코드 -->
        <div class="auth_box">
            
            <!-- 인증코드 입력창 컨테이너 -->
            <div class="input_container">
                <!-- 입력창 -->
                <input type="text" class="input input_auth" placeholder="받은 인증코드를 입력해주세요.">
                <!-- 유효시간 타이머 -->
                <span class="timer"></span>
            </div>

            <button class="AuthBtn" disabled>인증코드 확인</button>

        </div>

        <!-- 인증코드 재발송 -->
        <div class="ReRFCBox">
            <span>인증코드를 받지 못하셨나요?</span>
            <button class="ReRFCBtn">[인증코드 재발송]</button>   
             
        </div>

        <!-- 인증코드 상태 메세지 -->
        <p class="auth_msg msg">
            [인증코드 메세지]
        </p>

    </div>

</body>
</html>