생활코딩

Coding Everybody

리다이렉션과 로그인 개선

토픽 생활코딩 > 서버 > PHP > CodeIgniter

수업소개

현재 예제는 토픽 추가 버튼을 눌렀을 때 로그인이 필요하면 로그인을 요구한다. 로그인에 성공한 사용자를 메인 페이지로 이동시키는데 이것은 사용자가 목적하는 작업의 맥락을 흐트러트린다. 로그인 후 사용자의 원래 목적 페이지로 리다이렉션 시키는 방법을 알아본다. 

토픽 작성 동선 개선

토픽을 추가하기 위해서 '추가' 버튼을 눌렀을 때 로그인 되지 않은 사용자는 로그인 페이지로 이동을 시킨다. 로그인 후에는 글 작성 페이지로 이동하지 않고 메인 페이지로 이동하고 있는데 이 부분을 개선해보자. 

인증이 필요할 때 /auth/login 페이지로 이동시키면서 returnURL을 파라미터로 전달한다. 이 값은 로그인에 성공한 후에 페이지를 리다이렉션시키는 근거가 된다. 

/application/controllers/topic.php

function add(){

    // 로그인 필요

    // 로그인이 되어 있지 않다면 로그인 페이지로 리다이렉션

    if(!$this->session->userdata('is_login')){
        $this->load->helper('url');
        redirect('/auth/login?returnURL='.rawurlencode(site_url('/topic/add')));
    }

/application/controllers/auth.php

로그인 페이지에서 아이디/비밀번호를 입력하고 전송(submit)을 할 때 실제 인증은 /auth/authentication에서 이루어지고, 인증 후에 최종적인 페이지 리다이렉션도 /auth/authentication에서 이루어지기 때문에 /auth/authentication에 returnURL을 전달하기 위해서는 로그인 페이지의 form action 의 파라미터로 returnURL을 전달해야 한다. 아래는 이를 위한 단계이다.

function login(){
    $this->_head();
    $this->load->view('login', array('returnURL'=>$this->input->get('returnURL')));     
    $this->_footer();   
}

/application/views/login.php

</div>
<form class="form-horizontal" action="/index.php/auth/authentication<?=empty($returnURL) ? '' : '?returnURL='.rawurlencode($returnURL) ?>" method="post">
<div class="modal-body">

사용자가 로그인 버튼을 누르면 returnURL 값을 가지고 /auth/authentication 로 이동하게 된다. authentication 메소드는 사용자 인증을 시도하고, 성공했다면 전달된 returnURL로 페이지를 리다이렉션 시킨다. 

/application/controllers/auth.php

function authentication(){
    $this->load->model('user_model');
    $user = $this->user_model->getByEmail(array('email'=>$this->input->post('email')));
    if(!function_exists('password_hash')){
        $this->load->helper('password');
    }
	if(
		$this->input->post('email') == $user->email && 
        password_verify($this->input->post('password'), $user->password)
	) {
		$this->session->set_userdata('is_login', true);
		$this->load->helper('url');
        $returnURL = $this->input->get('returnURL');
        log_message('info', $returnURL);
        redirect($returnURL ? $returnURL : '/');
	} else {
		echo "불일치";
		$this->session->set_flashdata('message', '로그인에 실패 했습니다.');
		$this->load->helper('url');
		redirect('/auth/login');
	}
}

이런 방법으로 로그인 이후에 적절한 페이지로 리다이렉션을 적용하면 된다. 이것은 사용자가 로그인으로 인해서 하고자하는 일에 대한 맥락을 잃어버리지 않게 한다. 

태그

댓글

댓글 본문
  1. 존레논아부지
    완!!!!
  2. 의기천추
    function login() {
    $returnUrl = $this->input->get('returnUrl');
    if($returnUrl == false)
    $returnUrl = $_SERVER["HTTP_REFERER"];

    $this->load->view('head');
    $this->load->view('login', array('retUrl'=>$returnUrl));
    $this->load->view('footer');
    }
    대화보기
    • jeisyoon
      2021.08.24 리다이렉션과 로그인 개선 - OK
    • lunaman
      $_SERVER["HTTP_REFERER"] 함수도 많이 사용하지 않나요?
    • lunaman
      if(!$returnURL){
      $returnURL = "/topic";
      }
      대화보기
      • mafu
        if ($returnURL === FALSE) 을 if ($returnURL == FALSE) 이렇게 해보시면
        대화보기
        • 비만짱구
          강의 잘들었습니다. 항상 고맙습니다~

          그런데 강의를 듣던 중 궁금한 점이 생겨서 댓글 남깁니다.

          returnURL 값, 즉 사용자가 요청한 페이지 주소를

          수업에서는 get방식으로 받아서 이용했는데요

          쿠키나 세션에 저장해서 이용하는 방법은 수업에서 보여주신 방법보다 비효율적일까요?
        • code
          글 추가를 눌러서 로그인이 안되었을 경우 동영상 같이 하면 잘 작동됩니다.

          하지만!

          바로 로그인창에서 로그인했을 경우

          메인 화면 (topic.php)이 아닌 index.php 화면으로 넘어가버립니다.

          바로 로그인할 때는 returnURL 값이 없기 때문에

          if ($returnURL === FALSE) {
          $returnURL = '/'; <--- 여기에 해당할것 같은데..
          }
          redirect($returnURL);

          /topic.php/ 를 넣어도 안되고..메인화면으로 갈려면 어떻게 해야 할지.
        • 신입1
          항상 고맙습니다.
        • JustStudy
          고맙습니다
        • will
          //의견:
          /application/controllers/auth.php 파일에

          else {
          echo "불일치";
          $this->session->set_flashdata('message', '로그인에 실패 했습니다.');
          $this->load->helper('url');
          redirect('/auth/login');
          }
          }

          이구문에서 redirect시켜버리면 로그인 실패시 returnURL값이 날라갑니다.

          else{ //로그인 실패할경우

          $returnURL = $this->input->get('returnURL');
          $this->_head();
          $this->load->view('authority/login',array('returnURL'=>$returnURL));
          $this->_footer();
          }
          이렇게 해바꿔줘야 될꺼같습니다.
        • david20jazz
          최고의 강의 감사합니다.
        • 샤핀
          아하~ $autoload['helper'] = array('url', 'korean'); 과 같이 배열에 추가해 나가는 거군요. 역시 두드려 보길 잘했네요. 감사합니다. ^^
          대화보기
          • egoing
            그렇게 하면 덮어쓰기가 되겠죠?
            array('url','korean')
            대화보기
            • 샤핀
              강의 잘 봤습니다.
              질문이 있는데요.
              config -> autoload.php 에서
              $autoload['helper'] = array('url'); 과 같이 필요한 헬퍼를 더 추가하고자 할때는 ...

              $autoload['helper'] = array('url');
              $autoload['helper'] = array('korean'); //korean_helper.php와 같은 경우
              과 같이 구문을 추가해가면서 쓰면 되는 거겠지요?
              통빱으로도 당연히 그렇게 되겠거니 하면서도 돌다리 두드리게 되네요. ^^;
            • 소원아빠
              에휴.. 몇일 동안 위 문제 가지고 맨땅에 해딩하기를 반복...
              그러다 결국 문제점을 찾아 이렇게 올립니다.
              혹시나 저와 비슷한 경험을 하고 계신 분들께 조금이나마 도움이 될까 하여 이렇게 올립니다.
              저의 문제는 리다이렉션이 일어 나지 않고 URL이 계속하여
              http://192.168.1.9......add
              이와 같이 나오는 문제를 가지고 있었습니다.
              여기 저기 구굴링와 네이버 질문을 찾아 보아니
              apache서버 rewite모드와 .htaccess파일을 손보는 것등
              정말 무지막지하게 공부를 해야 할 것들이 많이 있더라구교 그러나
              여러가지 메뉴얼을 파고 또 파도 딱히 저에게 맞는 방법을 찾지 못하고
              몇일을 전전긍긍하다가,,
              http://superad.tistory.com/271
              에서 base URL 과 site_URL의 차이점이라는 글을 읽고서야
              왜 작동이 안되었나 라고 알게 되었습니다.
              시간 있으신 분들은 참고 하시고요
              저는 config폴더에 config.php 파일에서
              $config['base_url']= ' '; 에서 ' ' 이 두사이에 공백이 있어서 문제가 생긴 것으로
              최종 확인 하였습니다.
              $config['base_url']= ''; 이렇게 수정을 하여 확인해 보니 깔끔하게 처리가 되더라구요
              ㅡㅡ 조금은 허무 하면서도 제 무지함에 다시 한번 부끄러워지는 순간 입니다.
              대화보기
              • 소원아빠
                질문 있습니다.
                동영상 강의 하신 내용과
                /application/views/login.php에 있는 내용중에서<form action="/index.php/auth/authentication&lt;?=empty($returnURL) ? '' : '?returnURL='.rawurlencode($returnURL) ?&gt;" class="form-horizontal" method="post">
                내용이 조금 다른데요..
                단지 차이점은 site_url()을 사용 하느냐 마느냐 인가요??헐~~ 리다이렉션 부분에서 좀처럼 맨땅에 해딩하고 있는 사람입니다. ㅜㅜ감이 잡힐듯 말듯... 도와 주세요</form>
              • Guest
                고맙습니다.
              • egoing
                그렇군요! 동의 합니다. ;)
                2013/4/18 Disqus <notifications@disqus.net></notifications@disqus.net>
                대화보기
                • 양요한
                  로그인 처리 후에 redirect 함수를 이용하기 때문에로그인 폼으로 returnURL 을 넘길때 site_url 함수를 쓰지 않아도 될 것 같습니다.
                  url 헬퍼에서 제공하는 redirect 는 http로 시작하는 URL이 아니면 site_url 을 사용하고 있네요.