CI 묻고 답하기

제목 허접초보 개발자입니다....
글쓴이 느림보 작성시각 2012/01/11 20:14:47
댓글 : 6 추천 : 0 스크랩 : 0 조회수 : 22548   RSS
안녕하세요 허접 초보개발자인 느림보입니다....

다름이 아니라 이런 질문드려도 모르겠는데...

개념적이지 않아도 잘봐주시면 감사하겠습니다..

현재 코드 이그나이터 2.0.1 버전으로 홈페이지를 하나 작성중에 있습니다..(포트 폴리오용)

로그인에 관해서 올리는 질문인데요 현재 로그인을 할시에 id와 패스워드를 입력하면

DB에 접근하여 ID와 패스워드가 일치하면 해당 ID값을 가진 쿠키를 생성하여 후에 글쓰기라던가 회원정보 수정등 거의 대부분의 컨텐츠를 사용할수 있게 만들어 놓았습니다...

그런데 제 실력 부족인지 아니면 개념을 놓치고 있는건지... 글쓰기시에 ID쿠키가 쌓여 있으면 접근을 허락하게 해놨는데도
로그아웃후 쿠키삭제 명령을 실행을 해놓았는데 url로 직접접근하면 다시 접근되더라구요......

쿠키를 이용하여 홈페이지에 정보를 쓰거나 수정하게 하는 제 개념이 잘못된 것인가요...?

조금더 높은곳으로 가고 싶은 초보 프로그래머는 답변기다리겠습니다...

----수정

참고로...제가 개발중인 브라우져는 IE8입니다..

----수정 2

제가 테스트중인 소스입니다...

로그인페이지--view
<form name="login_form" method="post" action="/member/member/login">
  <tr>
    <td height="30"><span class="base"> 아이디</span></td>
    <td height="30"> <input type="text" class="text" name="reg_id"></td>
    <td height="60" rowspan="2" align="center">
          <a onclick="sendit()">
                <img src="<?=IMAGE_SRC?>/member/login.gif" border="0">
          </a>
    </td>
  </tr>
  <tr>
    <td height="30"><span class="base"> 비밀번호</span></td>
    <td height="30"> <input type="password" class="text"  name="reg_pass" onKeyUp="sendkey();"></td>
  </tr>
  </form>

로그인페이지--controller
function login()
 {
  $reg_id = $this->input->post('reg_id');//아이디
  $reg_pass = $this->input->post('reg_pass');//패스워드
  
  $this->load->model('member/member_s');//모델 불러옴
  $login_ok = $this->member_s->login( $reg_id, $reg_pass );//아이디와 패스워드를 모델에 보낸 결과값을 가져옴
  $login_re = $login_ok->num_rows();// 결과값의 갯수로 변환함
  $login_info = $login_ok->row();// 결과값을 데이터로 변환함
  $reg_id = $login_info->reg_id;// 아이디값 변수에 할당
  $reg_nick = $login_info->reg_nick;// 닉네임값 변소에 할당
  

  if( $login_re != 0 )// 결과 값의 갯수가 0이 아닐 경우
  {
   $cookie = array(
    'name'   => 'username',
        'value'  => "$reg_id",
        'expire' => '0',
        'path'   => '/',
        'secure' => false
       );//ID값을 가진 쿠키 배열
   $cookie2 = array
    (
    'name'   => 'usernick',
        'value'  => "$reg_nick",
        'expire' => '0',
        'path'   => '/',
        'secure' => false
    );//닉네임 값을 가지는 쿠키 배열
   
   $this->input->set_cookie($cookie);//쿠키 생성(아이디)
   $this->input->set_cookie($cookie2);//쿠키생성(닉네임)
   $ref = $this->input->post('ref');//이전 페이지 주소
   $this->load->helper('url');//url헬퍼 불러옴
   if( $ref != null )//이전페이지가 null값이 아닐 경우
   {
    redirect($ref);//이전페이지로 리다이렉트
   }
   else
   {
    redirect('main');//메인으로 리다이렉트
   }
  }
  else//결과값의 갯수가 0일경우
  {
   $data['vdata'] = "false" ;
   $this->load->view( 'member/fail', $data);//fail뷰 띄워줌
  }
 }
로그인시--model
function login( $reg_id, $reg_pass )
 {
  $sql = "SELECT reg_id, reg_nick
    FROM reg_member
    WHERE reg_id = ?
    AND reg_pass = ? ";
  $queryRes = array ( $reg_id, $reg_pass );
  return $query = $this->db->query( $sql, $queryRes );
 }

로그아웃시--controller

function logout()
 {
  $this->load->helper('cookie');//쿠키헬퍼 불러옴
  delete_cookie("username");// 쿠키삭제(아이디)
  delete_cookie("usernick");// 쿠키삭제(닉네임)
  $this->load->helper('url');//url헬퍼 불러옴
  redirect('main', 'refresh');//메인으로 ㄱㄱ
 }
ㅜㅜ....웅파님 죄송합니다.....개념적으로 제가 많이 잘못된건지 알려주세요
 다음글 form validation 히스토리에 대해 질문이 있... (3)
 이전글 /index.php/welcome 이 안 열립니다. (3)

댓글

변종원(웅파) / 2012/01/12 00:33:15 / 추천 0
ci의 세션을 사용하시는 것이 아니라 cookie를 따로 사용하신 건가요?

소스를 올려주셔야 어디가 문제인지 알려드릴 수 있을 것 같습니다.

파이어폭스에 web developer라는 익스텐션을 설치하면 화면에 해당하는 쿠키의 내용을 볼 수 있습니다.

쿠키 종류 및 내용 확인해보세요.
한대승(불의회상) / 2012/01/12 15:49:40 / 추천 0
로직상 문제가 있어 보이는 부분은 보이지 않는군요.
로그인 정보를 유지하는 목적으로 쿠키를 사용하는거라면 CI가 제공하는 세션을 사용하시는게 좋습니다.

http://codeigniter-kr.org/user_guide_2.1.0/libraries/sessions.html

접근하는 URL에서 어떤식으로 쿠키 검증을 하는지를 살펴 보세요.
인증없이도 접근이 가능하도록 되어 있을수도 있습니다.
변종원(웅파) / 2012/01/12 16:04:48 / 추천 0
이상은 없어보입니다.

delete_cookie를 쓰지마시고 set_cookie로 빈값을 넣어서 만들어보세요. (덮어 쓰는거죠)

그리고 로그인 체크는 값이 있는지 없는지로 체크하시구요.

느림보 / 2012/01/12 19:37:16 / 추천 0
ㅜㅜ 감사합니다 ㅎㅎ!!~~ 초보 프로그래머로써 열심히 하도록 노력하겠습니다...

참고로... 한가지만 더 여쭤봐도 될까요?? 현재 제가 제작 중인 홈페이지의 쿠키 유효성 검사 입니다.

이걸 하나의 함수에 한개씩 무조건 넣고 있습니다...ㅎㅎ 

현재 회원가입시 들어가는 회원약관 페이지가 나오는 부분입니다.--controller
function regist_pre()
 {
  $cookie = $this->input->cookie('username', 'true');// 아이디값이 들어있는 쿠키 $cookie 변수에 담음
  if( $cookie != null ) // $cookie의 값이 null이 아니라면 
  {
   $this->load->helper('url');//url헬퍼 불러옴
   redirect('main');// 메인으로 이동
  }
  else// 그외 라면~~
  {
   $this->load->view('member/regist_pre');//회원가입 약관등장!!
  }
 }
이런식으로 표시 해도 될런지요... 그런데 이걸 함수마다 하려니까 굉장히 코드가 길어져서ㅎㅎ...

한대승(불의회상) / 2012/01/12 20:25:21 / 추천 0
느림보// 그럴때 쓰라고 hook이 있습니다. ^^

아래 URL을 참조 하세요. 

http://codeigniter-kr.org/user_guide_2.1.0/general/hooks.html
느림보 / 2012/01/13 09:38:47 / 추천 0

ㅜㅜ 감사합니다...hook기능에 대해 좀더 공부하고 수정본을 올리도록 하겠습니다.

--수정

오늘 hook을 한번 써보고 다시 글을 올려봅니다 ㅎㅎ

hook기능을 이용하여 controller전이나

controller를 불러온 후에 적용되거나 코드이그나이터의 동작도를

변경할수 있는것을 알아 내긴 했습니다...그런데 문제는 프로젝트

전체에 먹혀서 나오니...ㅋㅋㅋ cookie가 없으니 무조건

로그인 페이지 부터 들어가 버리네요 ㅎㅎ 메인들어가면 무조건

로그인 페이지ㅎㅎ....예외페이지를 주거나 특정 페이지에만 hook기능을 먹히게 할수도 있는건가요?ㅎㅎ