코드이그나이터3 로그인 기능 만들기 식별과 인증 사용

 

로그인 식별과 인증, 해시, 쿠키, 세션

 

위 포스팅에서 로그인 방식은 아이디와 비밀번호 동시 인증 방식과

아이디와 비밀번호 분리 확인 방식이 있었다 실전으로 만들어 보자

코드이그나이터3를 사용했다.

세션과 해시도 적용했다.

 

 

아이디를 먼저 확인 후 다시 아이디와 비밀번호 확인하는 것으로 했다.

/var/www/html/application/config/routes.php에서 라우팅 설정해주자

$route['login'] = 'login/index';

login는 컨트롤러 이름 index는 컨트롤러 함수 이름이다.

www.example.com/login으로 접속했을 때 로그인 페이지 나오게 했다.

 

 

 

라우팅에서 컨트롤러 경로를 적어줬으니 컨트롤러를 만들자

/var/www/html/application/controllers/login.php

코드이그나이터는 이렇게 순서대로 하면 쉬운 거 같다.

<?php
defined('BASEPATH') OR exit('No direct script access allowed');


class Login extends CI_Controller {
    public function index()
    {
        if(isset($_SESSION['email'])){
            $this->load->view('header');
            $this->load->view('mypage');
            $this->load->view('footer');
           
        }else{
            $this->load->view('login_main');
        }
       
    }
}

뷰 파일도 만들어주었다.

로그인 상태라면 mypage로 이동할 것이고 아니라면 로그인 창으로 가게 해두었다.

로그인 창을 만들거니 로그인 창으로 가보자

 

 

 

위에 뷰 파일에 이름을 설정했으니 그대로 파일 만들자

/var/www/funny/application/views/login_main.php

뷰 파일은 코드가 너무 길어 주요 부분만 적겠다.

 

 

로그인 폼 회원가입 폼을 나누어 주었다.

function showJoinForm() { $('.login_box').hide(); $('.join_box').show(); } 
function showLoginForm() { $('.join_box').hide(); $('.login_box').show(); }

 

 

 

아이디 비밀번호 분리해서 인증하는 것은 아이디 먼저 확인한다고 했으니  이메일 먼저 확인

이메일 값 jQuery를 사용하여 사용자가 입력한 이메일 값 가져온다.

비어있으면 종료

그렇지 않으면 Ajax요청으로 post 방식을 사용하여 /log_hash/check_id 요청 보냄

jQuery Ajax를 사용하는 이유는 새로고침하지 않아도 필요한 정보를 업데이트하기 위함

function showPasswordField() { 
       var email = $('.email').val(); 
       if(email != '') { $.ajax({ 
          url: '/log_hash/check_id',
          type: 'POST', 
          data: {'email': email},
          dataType: 'json', 
          success: function(response) {
           if(response.exists) { 
           $('#passwordField').show();
           $('.pwd').focus(); 
         } else { 
           alert('존재하지 않는 이메일입니다.');
         }
       }, 
       error: function(xhr, status, error) { 
         console.error("에러 발생:", error);
      } 
   }); 
  } 
}

 

 

 

이메일 확인했으니 이메일과 비밀번호 확인한다.

/log_hash/user_id로 요청을 보내면 컨트롤러에서 처리한다 타입은 post 방식이다.

$('.login_btn').click(function() {
         var email = $('.email').val(); 
         var password = $('.pwd').val();
        if(password != '') { 
          $.ajax({ url: '/log_hash/user_id',
          type: 'POST', data: {'email': email, 
          'pwd': password}, dataType: 'json',
          success: function(response) { 
            if(response.response_data) { 
              location.reload(); 
            } else { 
              alert('비밀번호가 틀렸습니다.');
            }
          }, 
           error: function(xhr, status, error) { 
            console.error("에러 발생:", error);
           } 
       });
     } else { 
        alert('비밀번호를 입력해주세요.'); 
       $('.pwd').focus(); 
     }
});

 

 

이메일 형식 검사도 넣어봤다.

 function isValidEmail(email) {
    var pattern = /^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/; // 간단한 이메일 패턴 검사
    return pattern.test(email);
   }

 

 

 

/log_hash/user_id와 /log_hash/check_id 여기로 요청을 보낸다고 했으니 가보자

log_hash는 컨트롤러이고 뒤에는 함수 이름이다.

/var/www/html/application/controllers/log_hash.php 이동

function check_id() {
        $req = $this->input->post();
        $email = isset($req['email']) ? $req['email'] : '';


        $this->load->model('User_check');
        $exists = $this->User_check->check_id($email);


        echo json_encode(array(
            'exists' => $exists
        ));
    }

post 요청으로 전달된 데이터를 받아오고

email 값을 확인하고 있다면 $email에 저장 없다면 빈 값

그리고 모델 로딩 모델은 데이터베이스와 상호작용

모델에서 이메일이 있다면 json 형식으로 인코딩 후 출력 사용자 클라이언트에서 결과 받음

 

 

 

 

 

 

위와 비슷하고 비밀번호 추가된 것

비밀번호 해시는 md5를 사용

function user_id() {
        $req = $this->input->post();
        $email = isset($req['email']) ? $req['email'] : '';
        $pwd = isset($req['pwd']) ? $req['pwd'] : '';
        $hashed_pwd = md5($pwd);
   
        $this->load->model('User_check');  
        $member_info = $this->User_check->user_id($email, $hashed_pwd);
       
        $response = array('result_code' => "200", 'result_message' =>  "ok");
        if ($member_info) {
            $temp_arr = array(
                'email' => $member_info->email,
                'srl' => $member_info->srl,
                'name' => $member_info->name,
                'role' => ($member_info->is_admin == 1) ? 'admin' : 'user'
            );
            $this->session->set_userdata($temp_arr);
            $response['response_data'] = $temp_arr;
        } else {
            $response['response_data'] = null;
        }
   
        echo json_encode($response);
    }

 

 

 

위에서 모델을 로드한다고 했으니 모델로 가보자

/var/www/funny/application/models/User_check.php

    function check_id($email) {
        $sql = "SELECT * FROM user_table Where email = ?";
        $query = $this->db->query($sql, array($email));
        return $query->row();
    }



    function user_id($email, $pwd) {
        $member = $this->check_id($email);
        if ($member && $member->pwd === $pwd {
        return $member;
    }
    return null;
    }

컨트롤러에서 모델을 로드하면 코드이그나이터 쿼리가 실행

요약하면 위의 함수는 이메일을 조회하는 것이고 밑에 함수는 위에서 조회한 이메일이 있는 경우 패스워드를 조회하는 것이다.

 

 

 

위의 코드로 만든 로그인 기능 구현

https://funny.todayabc.xyz/sepahash

 

 

 

 

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다