외부로그인 '아이디저장' 질문드립니다. > 그누4 질문답변

매출이 오르면 내리는 수수료! 지금 수수료센터에서 전자결제(PG)수수료 비교견적 신청해 보세요!

그누4 질문답변

그누보드4 관련 질문은 QA 로 이전됩니다. QA 그누보드4 바로가기
기존 게시물은 열람만 가능합니다.

외부로그인 '아이디저장' 질문드립니다. 정보

외부로그인 '아이디저장' 질문드립니다.

본문

외부로그인 기본스킨에 '자동로그인'이 포함되어 있어서, 홈피 사용자가 매우 편리한 반면, 자칫 타인에게 노출될 우려도 있어, 주의가 필요하므로 사용을 자제하는 경향이 있는거 같습니다.
그래서, 요즘 많은 사이트에서 쓰는 아이디만 저장되는 '아이디 저장'기능을 추가하려고 합니다. (우리 sir도 이미 사용하구 있구요..)

일단 '외부로그인 스킨'에서, 체크박스에 '아이디 저장'이라고 써있는 스킨을 받아서 설치를 해보니, 스킨 디자인 하고 auto 라는 글자를 '아이디 저장'이라고 바꾸었을 뿐, 기능은 기본 스킨 그대로 '자동 로그인'이더군요.. --;;

그래서 질문답변을 검색해 보니, 의외로 이에 대한 질답이 적고 2006년 4월에 '하늘처럼'님이 올리신 활용팁 답변 딱 1개을 찾았습니다. (위에 링크)
---> 그런데 문제는 그대로 아무리 해봐도 아이디저장이 안되는 겁니다. 아이디저장 체크박스는 새로 생기는데, 체크하고 로그인 한후에, 로그아웃했을때 아이디 박스에 아이디가 남아있어야 하는데, 그게 안남아 있는 겁니다. 제가 뭘 잘못 적용한거 같기도 하구요.. 혹시 버젼이 업 되면서 그러는거는 아닌지도 모르겠구요.. 또, 그 글 코멘트에 원본팁에 뭔가 좀 에러가 있으니 이러 저렇게 수정해보라는 글도 있어서, 그렇게도 해보고 했는데.. 역시 안되구요.. 이리 저리 아무리 해봐도 안돼서, 질문으로 올립니다. 아시는 분께서 꼭 좀 답변 바랍니다..

아래 '2006년4월에 하늘처럼 님이 올리신 팁'과 *** 또한 제가 적용한 파일도 2개 모두 올리니, 살펴보고 답변 주시면 정말 감사하겠습니다..  --;;
============================================

*** 활용팁 답변글: 하늘처럼
--------------------------------------------
안녕하세요..
그누보드홈페이지의 상단에 있는 아이디 저장 기능만을 사용하고 싶을때 사용하면 좋습니다.


bbs/login_check.php
---------------------------------------------------------
자동로그인 설정 밑에 추가합니다.. (쿠키저장은 한달정도합니다)

// 아이디 자동저장
if($id_save) {
    set_cookie('ck_id_save', $mb[mb_id], time()+2592000);
}else{
    set_cookie('ck_id_save', '', 0);
}


skin/outlogin/basic/outlogin.skin.1.php
----------------------------------------------------------------
<?
if (!defined("_GNUBOARD_")) exit; // 개별 페이지 접근 불가

// 아이디 자동저장
$ck_id_save = get_cookie("ck_id_save");

if ($ck_id_save) {
$ch_id_save_chk = "checked";
}
?>

// 아이디 입력부분 수정
<input name="mb_id" type="text" size="12" maxlength="20" required itemname="아이디" value='아이디' onMouseOver='chkReset(this.form);' onFocus='chkReset(this.form);' value='<?=$ck_id_save?>'>

// 아이디저장 부분 추가 (자동저장앞에 추가하면 좋음)
<input type='checkbox' id='id_save' name='id_save' <?=$ch_id_save_chk?>>아이디 저장


유용하게 쓰이기를 바랍니다..  끝
===========================================================================
===========================================================================

*** 여기는 제가 적용한 파일 2개중 1번째

bbs/login_check.php
---------------------------------------------------------
<?
include_once("./_common.php");

$mb_id      = $_POST[mb_id];
$mb_password = $_POST[mb_password];

if (!trim($mb_id) || !trim($mb_password))
    alert("회원아이디나 패스워드가 공백이면 안됩니다.");

/*
// 자동 스크립트를 이용한 공격에 대비하여 로그인 실패시에는 일정시간이 지난후에 다시 로그인 하도록 함
if ($check_time = get_session("ss_login_check_time")) {
    if ($check_time > $g4['server_time'] - 15) {
        alert("로그인 실패시에는 15초 이후에 다시 로그인 하시기 바랍니다.");
    }
}
set_session("ss_login_check_time", $g4['server_time']);
*/

$mb = get_member($mb_id);

// 가입된 회원이 아니다. 패스워드가 틀리다. 라는 메세지를 따로 보여주지 않는 이유는
// 회원아이디를 입력해 보고 맞으면 또 패스워드를 입력해보는 경우를 방지하기 위해서입니다.
// 불법사용자의 경우 회원아이디가 틀린지, 패스워드가 틀린지를 알기까지는 많은 시간이 소요되기 때문입니다.
if (!$mb[mb_id] || (sql_password($mb_password) != $mb[mb_password])) {
    alert("가입된 회원이 아니거나 패스워드가 틀립니다.\\n\\n패스워드는 대소문자를 구분합니다.");
}

// 차단된 아이디인가?
if ($mb[mb_intercept_date] && $mb[mb_intercept_date] <= date("Ymd", $g4[server_time])) {
    $date = preg_replace("/([0-9]{4})([0-9]{2})([0-9]{2})/", "\\1년 \\2월 \\3일", $mb[mb_intercept_date]);
    alert("회원님의 아이디는 접근이 금지되어 있습니다.\\n\\n처리일 : $date");
}

// 탈퇴한 아이디인가?
if ($mb[mb_leave_date] && $mb[mb_leave_date] <= date("Ymd", $g4[server_time])) {
    $date = preg_replace("/([0-9]{4})([0-9]{2})([0-9]{2})/", "\\1년 \\2월 \\3일", $mb[mb_leave_date]);
    alert("탈퇴한 아이디이므로 접근하실 수 없습니다.\\n\\n탈퇴일 : $date");
}

if ($config[cf_use_email_certify] && !preg_match("/[1-9]/", $mb[mb_email_certify]))
    alert("메일인증을 받으셔야 로그인 하실 수 있습니다.\\n\\n회원님의 메일주소는 $mb[mb_email] 입니다.");

$member_skin_path = "$g4[path]/skin/member/$config[cf_member_skin]";
@include_once("$member_skin_path/login_check.skin.php");

// 회원아이디 세션 생성
set_session('ss_mb_id', $mb[mb_id]);
// FLASH XSS 공격에 대응하기 위하여 회원의 고유키를 생성해 놓는다. 관리자에서 검사함 - 110106
set_session('ss_mb_key', md5($mb[mb_datetime] . $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']));

// 3.26
// 아이디 쿠키에 한달간 저장
if ($auto_login) {
    // 3.27
    // 자동로그인 ---------------------------
    // 쿠키 한달간 저장
    $key = md5($_SERVER[SERVER_ADDR] . $_SERVER[REMOTE_ADDR] . $_SERVER[HTTP_USER_AGENT] . $mb[mb_password]);
    set_cookie('ck_mb_id', $mb[mb_id], 86400 * 31);
    set_cookie('ck_auto', $key, 86400 * 31);
    // 자동로그인 end ---------------------------

// 아이디 자동저장
if($id_save) {
    set_cookie('ck_id_save', $mb[mb_id], time()+2592000);
}else{
    set_cookie('ck_id_save', '', 0);
}

} else {
    set_cookie('ck_mb_id', '', 0);
    set_cookie('ck_auto', '', 0);
}


if ($url)
{
    $link = urldecode($url);
    // 2003-06-14 추가 (다른 변수들을 넘겨주기 위함)
    if (preg_match("/\?/", $link))
        $split= "&";
    else
        $split= "?";

    // $_POST 배열변수에서 아래의 이름을 가지지 않은 것만 넘김
    foreach($_POST as $key=>$value)
    {
        if ($key != "mb_id" && $key != "mb_password" && $key != "x" && $key != "y" && $key != "url")
        {
            $link .= "$split$key=$value";
            $split = "&";
        }
    }
}
else
    $link = $g4[path];

goto_url($link);
?>
==================================================================
==================================================================
*** 이것은 제가 적용한 파일 2개중 2번째

skin/outlogin/basic/outlogin.skin.1.php
----------------------------------------------------------------
<?
if (!defined("_GNUBOARD_")) exit; // 개별 페이지 접근 불가

// 아이디 자동저장
$ck_id_save = get_cookie("ck_id_save");

if ($ck_id_save) {
$ch_id_save_chk = "checked";
}
?>

<?
if (!defined("_GNUBOARD_")) exit; // 개별 페이지 접근 불가

if ($g4['https_url']) {
    $outlogin_url = $_GET['url'];
    if ($outlogin_url) {
        if (preg_match("/^\.\.\//", $outlogin_url)) {
            $outlogin_url = urlencode($g4[url]."/".preg_replace("/^\.\.\//", "", $outlogin_url));
        }
        else {
            $purl = parse_url($g4[url]);
            if ($purl[path]) {
                $path = urlencode($purl[path]);
                $urlencode = preg_replace("/".$path."/", "", $urlencode);
            }
            $outlogin_url = $g4[url].$urlencode;
        }
    }
    else {
        $outlogin_url = $g4[url];
    }
}
else {
    $outlogin_url = $urlencode;
}
?>

<script type="text/javascript" src="<?=$g4[path]?>/js/capslock.js"></script>
<script type="text/javascript">
// 엠파스 로긴 참고
var bReset = true;
function chkReset(f)
{
    if (bReset) { if ( f.mb_id.value == '아이디' ) f.mb_id.value = ''; bReset = false; }
    document.getElementById("pw1").style.display = "none";
    document.getElementById("pw2").style.display = "";
}
</script>


<!-- 로그인 전 외부로그인 시작 -->
<form name="fhead" method="post" onsubmit="return fhead_submit(this);" autocomplete="off" style="margin:0px;">
<input type="hidden" name="url" value="<?=$outlogin_url?>">
<div style="width:220px;">
    <div style="clear:both;"><img src="<?=$outlogin_skin_path?>/img/login_top.gif" width="220" height="42"></div>
    <div style="clear:both; float:left; width:5px; height:115px; background:#F8F8F8;"></div>
    <div style="width:210px; float:left; margin-top:10px;">
        <table width="210" border="0" cellpadding="0" cellspacing="0">
        <tr>
            <td width="141">
                <table width="141" border="0" cellpadding="0" cellspacing="0">
                <tr>
                    <td width="35" height="23"><img src="<?=$outlogin_skin_path?>/img/login_id.gif" width="35" height="23"></td>
                    <td width="106" height="23" colspan="2" align="center"><input name="mb_id" type="text" size="12" maxlength="20" required itemname="아이디" value=아이디 onMouseOver='chkReset(this.form);' onFocus='chkReset(this.form);' value='<?=$ck_id_save?>'>
</td>
                </tr>
                <tr>
                    <td width="35" height="23"><img src="<?=$outlogin_skin_path?>/img/login_pw.gif" width="35" height="23"></td>
                    <td id=pw1 width="106" height="23" colspan="2" align="center"><input type="text" class=ed size="12" maxlength="20" required itemname="패스워드" value='패스워드' onMouseOver='chkReset(this.form);' onfocus='chkReset(this.form);'></td>
                    <td id=pw2 style='display:none;' width="106" height="23" colspan="2" align="center"><input name="mb_password" id="outlogin_mb_password" type="password" class=ed size="12" maxlength="20" itemname="패스워드" onMouseOver='chkReset(this.form);' onfocus='chkReset(this.form);' onKeyPress="check_capslock(event, 'outlogin_mb_password');"></td>
                </tr>
                </table>
            </td>
            <td width="69" height="46" rowspan="2" align="center"><input type="image" src="<?=$outlogin_skin_path?>/img/login_button.gif" width="52" height="46"></td>
        </tr>
        </table>
        <div style="clear:both; padding:2px 0 0 42px;">
            <div style="float:left;"><input type='checkbox' id='id_save' name='id_save' value="1" <?=$ch_id_save_chk?>>아이디 저장
<input type="checkbox" name="auto_login" value="1" onclick="if (this.checked) { if (confirm('자동로그인을 사용하시면 다음부터 회원아이디와 패스워드를 입력하실 필요가 없습니다.\n\n\공공장소에서는 개인정보가 유출될 수 있으니 사용을 자제하여 주십시오.\n\n자동로그인을 사용하시겠습니까?')) { this.checked = true; } else { this.checked = false; } }"></div>
            <div style="float:left; padding-left:5px;"><img src="<?=$outlogin_skin_path?>/img/login_auto.gif" width="46" height="28"></div>
        </div>
        <div style="clear:both; padding:0 0 0 42px;">
            <!-- <a href="javascript:win_password_forget();"><img src="<?=$outlogin_skin_path?>/img/login_pw_find_button.gif" width="90" height="20" border="0"></a> -->
            <a href="javascript:win_password_lost();"><img src="<?=$outlogin_skin_path?>/img/login_pw_find_button.gif" width="90" height="20" border="0"></a>
            <a href="<?=$g4[bbs_path]?>/register.php"><img src="<?=$outlogin_skin_path?>/img/login_join_button.gif" width="69" height="20" border="0"></a>
        </div>
    </div>
    <div style="float:left; width:5px; height:115px; background:#F8F8F8;"></div>
    <div style="clear:both;"><img src="<?=$outlogin_skin_path?>/img/login_down.gif" width="220" height="14"></div>
</div>
</form>

<script type="text/javascript">
function fhead_submit(f)
{
    if (!f.mb_id.value) {
        alert("회원아이디를 입력하십시오.");
        f.mb_id.focus();
        return false;
    }

    if (document.getElementById('pw2').style.display!='none' && !f.mb_password.value) {
        alert("패스워드를 입력하십시오.");
        f.mb_password.focus();
        return false;
    }

    <?
    if ($g4[https_url])
        echo "f.action = '$g4[https_url]/$g4[bbs]/login_check.php';";
    else
        echo "f.action = '$g4[bbs_path]/login_check.php';";
    ?>

    return true;
}
</script>
<!-- 로그인 전 외부로그인 끝 -->

댓글 전체

얼추 보니 별문제 없어보입니다
로그인 시에 id_save 값이 제대로 넘어오는지
로그인 이후에 cookie가 제대로 저장되고 읽히는지
일일히 확인해가면서 문제를 찾으셔야 할것 같네요
// 아이디 자동저장
if($id_save) {
    set_cookie('ck_id_save', $mb[mb_id], time()+2592000);
}else{


이 부분에서
// 아이디 자동저장
var_dump($id_save); // true로 넘어오는지 한번 보세요
exit;

if($id_save) {
    set_cookie('ck_id_save', $mb[mb_id], time()+2592000);
}else{
몽구스 님 답변 주셔서 감사드립니다.
그런데, .. // true로 넘어오는지 보라고 하셨는데, 어디서 보라는 말인지 이해를 못했습니다.
제가 아직 서툴러서..  좀 구체적으로 설명해 주시면 고맙겠습니다..
// 아이디저장 부분 추가 (자동저장앞에 추가하면 좋음)
<input type='checkbox' id='id_save' name='id_save' <?=$ch_id_save_chk?>>아이디 저장

여기를 보면 value가 없습니다. 체크하나 안하나 값이 전송되지 않기 때문에 항상 $id_save는 빈값이 되므로 체크를 하여도 if($id_save) 는 거짓이 됩니다.

수정=><input type='checkbox' id='id_save' name='id_save' value="1" <?=$ch_id_save_chk?>>아이디 저장
jacobswell님도 답변주셔서 감사합니다.
그런데, 답변대로 수정을 했는데도 '아이디'가 저장이 되지 않습니다. 흑흑..
그래서 혹시 다른 것에 영향을 받지 않나싶어서, 자료를 백업받아놓고, 그누보드4 를 다시 새로 설치했습니다.
그리고 초기상태에서 다시 위에 팁대로 수정하고, 알려주신대로 추가 수정을 해도 안돼는건 왜 일까요.. --;;
꼭 좀 해결해야 되는데..
위에 다시 수정한 대로 파일을 새로 올렸습니다. 혹시 ftp로 보아 주실수 있다면, ftp id 와 pw를 알려드리겠습니다. 감사합니다..
그건 아마도 chkReset()이란 함수로 인해서 그럴겁니다. 마우스를 올리는 순간 공란으로 나오게 세팅되닌까 그럽니다.

outlogin.skin.1.php에 chkReset()이란 함수를 찾아보세요. 만일 있으면 그 안에 f.mb_id.value = '';로 되어 있는 부분을 수정해야 합니다. f.mb_id.value = '<?=$ck_id_save?>'; 이렇게 수정하면 마우스 올리면 쿠키에 저장된 아이디가 보입니다...
jacobswell님 답변 감사합니다. 그런데, 그렇게 해도 안됩니다.
정성껏 답변을 주시는데 그래도 안되니 제가 참 미안합니다.
--------------------------------
홈피에서 id저장을 체크하고, 로그인 한후, 나중에 로그아웃을 하거나 새창에서 홈을 열면, id저장 체크박스의 체크와 아이디 입력란에 id가 남아 있어야 하는데.. 그것 부터가 안됩니다.
그누4 를 새로설치 해보고, 이리 저리 반복해 봐도 안 되니 정말 답답하군요..  --;;
바쁘시겠지만 혹시 더 알려 주실수 있다면 더 해보도록 하겠습니다. 정말 감사합니다..
저는 잘 됩니다^^. 그누보드 최신 것을 다운 받은 후 수정을 다음과 같이 했습니다:

login_check.php 에서
} else {
    set_cookie('ck_mb_id', '', 0);
    set_cookie('ck_auto', '', 0);
}
를 찾은 후 뒤에 다음을 붙여넣기 합니다:
if ($id_save) {
set_cookie('ck_id_save', $mb[mb_id], time()+60*60*24*30);
}
else {
set_cookie('ck_id_save', '', 0);
}

그리고 outlogin.skin.1.php에서
}
else {
    $outlogin_url = $urlencode;
}
를 찾은 후 그 뒤에 다음을 붙여넣기 합니다:
$ck_id_save = get_cookie('ck_id_save');
$ch_id_save_chk = '';
if ($ck_id_save) {
$ch_id_save_chk = ' checked="checked"';
}

그리고
 if (bReset) { if ( f.mb_id.value == '아이디' ) f.mb_id.value = ''; bReset = false; }
를 찾은 후
 if (bReset) { if ( f.mb_id.value == '아이디' ) f.mb_id.value = '<?php echo $ck_id_save;?>'; bReset = false; }
로 바꾸어줍니다.

마지막으로 <input type="checkbox" name="auto_login" value="1" 를 찾아서 그 "앞"에 다음을 붙여넣기 했습니다. 이번에는 "앞"쪽입니다. 뒤에 해도 됩니다:
<input type="checkbox" id="id_save" value="1" name="id_save"<?php echo $ch_id_save_chk;?> />아이디 저장&nbsp;&nbsp;
jacobswell 님! 어제 늦게 또다시 답변을 달아주셔서 너무나 고마웠습니다.
알려주신대로 바로 수정을 해서 올려보았구요. 아이디 입력란에 비로소 아이디가 저장되는 것을 보고,
너무나 기쁘고 고마웠습니다. 그리고 몇차례 테스트를 해 보았는데, 한가지 궁금한 점이 있습니다.
---------------------------------------
아이디 저장은 다음번에 아이디를 안쳐도 되므로 편리하게 하는것이 목적인데..
웹창을 모두 닫은 다음, 창을 새로 띄워 홈에 접속했을 경우  또는 PC를 새로 켜고 홈에 접속했을 경우에 작동하지 않습니다..  현재 창에서는 이미 로그인을 했으므로 다시 로그인 할 일이 사실 거의 없습니다. 이 기능은 다음번을 위한 것이기 때문에 다음번에 홈에 접속했을때 아이디가 바로 창에 보여져야 하는 것이 중요한거 같은데요.. 그게 안되네요. 우리 sir홈 도 그렇고, 다른 사이트로 그렇게 기능을 하고 있거든요..
그런데 혹시 제가 또 뭔가 설치을 잘못한건 아닌가 하는 생각도 듭니다만.. 이부분 좀 확인하시고 답변 주시면 정말 고맙겠습니다.  좋은 날 되세요.. 감사합니다.. ^^*
그 부분부터는 조금 복잡합니다. header()값과 session_cache_limiter()에 들어가는 값을 바꾸어 주어야 할 필요가 있는데 header()는 head.sub.php에 있고 session_cache_limiter()는 common.php에 있습니다. 문제는 이걸 수정하는 것이 까다로운 부분도 있지만 수정시 보안에 치명적일 수 있기 때문에 현재는 브라우져를 끄고 다시 실행하면 쿠키가 없어지도록 설정되어 있어요.
답변 주신 분들께 감사드립니다. 특히 jacobswell 님께서 많은 도움 주셨습니다.
원하는 결과를 얻지는 못했지만, 다음을 기약하겠습니다.
즐거운 날 되세요.. ^^*
전체 66,558 |RSS
그누4 질문답변 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT