[Android Studio] 안드로이드에서 로그인 기능 구현하기 [2]

     



안녕하세요? 오늘은 지난 포스팅에서 마무리 하지 못한 회원가입/로그인 마무리를 해보겠습니다.

지난 포스팅에서는 다음과 같은 기능을 구현했었어요.


1. 아이디, 비밀번호 입력하는 화면 만들기

2. 비밀번호와 비밀번호검증칸 만들기

3. AsyncTask를 이용해 DB에 아이디, 패스워드 입력하기

지난번 포스팅 바로가기



이번 포스팅에서는 회원가입 마무리와 로그인 처리를 개발 할 예정입니다. 구체적으로는 다음과 같습니다.


1. 서버와 클라이언트 사이의 통신. 리턴값 셋팅하기

2. 아이디와 비밀번호를 이용해 로그인 하기

3. 회원가입시 이메일 보내기


그럼 시작해 볼까요?



 1. 서버와 클라이언트 사이의 통신. 리턴값 셋팅하기


지난 포스팅에서 회원가입을 호출하면 DB에 아이디와 비밀번호를 저장하는 기능을 만들었습니다. 언뜻보면 다 만든 것 처럼 생각 될 수도 있지만, 사실 거의 완성되지 않은 프로세스라고 생각합니다. 그 이유는???


학교다니면서 코딩할 때와 실제로 회사에와서 '실무'를 할 때의 차이점이 몇가지 있습니다. 그 중에 하나가 바로 '예외처리'와 '응답'인데요. 만약 학교에서 하는 간단한 프로젝트였다면 여기까지 개발하고 끝냈을 겁니다. 하지만 실무에서는 이제부터가 시작이죠. 우리는 이제부터 이 코드가 정상적으로 실행되지 않으면 어떻게 될지를 고민해야 합니다.


일단 우리가 만든 회원가입이 정상인지 비정상인지 어떻게 판단할까요? 지금은 판단 할 수 있는 것이 아무것도 없습니다. 서버에서 응답이 안오기 때문이죠. 우리는 어떤 기능을 개발할 때 항상 그것에 대한 응답(리턴값)을 생각해야합니다. 함수를 만들 때도 return으로 끝나듯이 말이에요.


응답은 여러가지 값이 될 수 있습니다. '정상', '오류', '에러', '중복값있음' 과 같이 말이죠. 이렇게 한글로 표현하는 것보다 코드에서는 숫자나 영어와 같은 '에러코드'를 사용합니다. C언어에서는 보통 0보다 크면 정상. 0보다 작은면 오류라고 표현합니다. SQL에서는 정상적으로 수행되었다면 sqlcode값을 0으로 보여주죠.


이렇게 우리도 우리가 만든 프로세스에 코드를 만들어 봅시다. 일단 정상이면 0000을 리턴하게 만들죠. 4자리인 이유는 그냥.. 4바이트가 왠지 안정적이자나요.


그렇다면 우리가 만든 회원가입이 정상이라는 것을 어떻게 확인할 수 있을까요. 이 기능이 하는 일은 아이디와 비밀번호를 받아서 DB에 INSERT하는 것이기 때문에 INSERT가 정상적으로 되었다면 우리는 이 프로세스가 정상적으로 종료되었다고 판단할 수 있습니다. 따라서 쿼리문의 결과를 확인할 수 있는 sqlcode값을 이용해 응답값을 만들어 봅시다.


1
2
3
4
 $sql = "INSERT INTO USERS(USERID, PASSWORD) VALUES('$id', '$pw')";
 
   $result = mysql_query($sql);
 
cs


위 코드에서 mysql_query()가 실행되면 result라는 결과값을 리턴합니다. 


설명 ¶

resource mysql_query ( string $query [, resource $link_identifier ] )

mysql_query()는 link_identifier로 지정한 데이터베이스 서버에 하나의 질의를 전송합니다. (다중 질의는 지원하지 않습니다)


반환값 ¶

mysql_query()는 SELECT, SHOW, DESCRIBE, EXPLAIN, 결과셋을 반환하는 기타 구문에서 성공시 resource를, 오류시 FALSE를 반환합니다.

mysql_query()는 다른 형식의 SQL 구문, INSERT, UPDATE, DELETE, DROP 등에서 성공하면 TRUE를, 실패하면 FALSE를 반환합니다.

좀 더 자세한 설명은 링크를 참고하세요.



mysql_query의 경우 INSERT쿼리에 대해 TRUE, FALSE만을 반환합니다. 

따라서 리턴 값에 조건을 걸어 쿼리가 성공적으로 실행되었는지 체크할 수 있습니다. 


1
2
3
4
5
6
7
8
9
   // result of sql query
   if(!$result)
   {
            die("mysql query error");
   }
   else
   {
            echo"0000";
   }
cs


위에서 result = mysql_query 로 리턴값을 result에 넣었기 때문에 if문으로 쿼리의 정상 실행 여부를 체크 할 수 있습니다.

정상실행되면 0000을 실패하면 mysql query error를 화면에 출력합니다. 이 값들이 안드로이드에서 서버에 쿼리를 호출했을 때의 응답값이 됩니다. 


/* 서버에서 응답 */
Log.e("RECV DATA",data);

if(data.equals("0000"))
{
Log.e("RESULT","성공적으로 처리되었습니다!");
}
else
{
Log.e("RESULT","에러 발생! ERRCODE = " + data);
}


코드를 위처럼 짜놨습니다. 서버에서 받은 데이터가 0000이면 성공적으로 처리되었습니다!! 메시지를, 0000이 아니라면 에러 발생! 이라는 문구와 서버에서 받은 코드를 출력하도록 말이죠. 이렇게 에러코드를 출력하면 에러가 발생했을때 에러코드를 서버담당자에게 전달함으로써 어떤에러인지 쉽게 파악 가능합니다.


하지만 지금 서버에서는 쿼리의 성공/실패만 알고 성공시 코드가 0000으로만 설정되있습니다. 에러코드가 분류가 되어있지 않습니다. 따라서 쿼리 실행 결과 코드를 반환하는 함수를 이용해 에러코드까지 출력하도록 바꿔봅시다.


1
2
3
4
5
6
 $sql = "INSERT INTO USERS(USERID, PASSWORD) VALUES('$id', '$pw')";
 
   $result = mysql_query($sql);
 
   // result of sql query
   echo mysql_errno($connect);
cs


쿼리 성공여부를 판단하는 소스부분을 위와같이 변경했습니다. 여기서 사용한 mysql_errno는 마지막에 실행된 쿼리의 코드를 반환하는 함수입니다.


/* 서버에서 응답 */
Log.e("RECV DATA",data);

if(data.equals("0"))
{
Log.e("RESULT","성공적으로 처리되었습니다!");
}
else
{
Log.e("RESULT","에러 발생! ERRCODE = " + data);
}

mysql_errno는 쿼리가 정상 실행 되었을때 '0' 값을 리턴하기 때문에 소스도 약간 수정합니다.



어플을 다시 실행해서 아까와 같은 값을 넣으면 위와같이 에러코드가 떨어집니다. 에러코드 1062는 중복되는 값을 테이블에 입력했을 때 발생하는 에러코드입니다. 여기서 발생하는 에러코드는 sqlcode값이므로 구글링 해보시면 각 에러코드 별 에러내용을 쉽게 찾을 수 있습니다.


실제로 실무에서 SQL을 사용하는 프로세스에서는 이와 같은 방법으로 errcode를 설정해 놓습니다. sqlcode != 0 일경우를 정상실행으로 식별하고 나머지를 에러로 판단하곤 합니다. SQL을 사용하는 경우 에러코드를 sqlcode로 사용하지만, 쿼리사용이 없을경우 개발자가 임의로 에러코드를 생성하여 사용하는 경우도 있습니다. 


서버에서 넘어오는 코드를 개발자만 알고있으면 안되겠죠?

에러코드에 따라 적절한 메시지를 띄우는 코드를 추가합시다.


@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);

/* 서버에서 응답 */
Log.e("RECV DATA",data);

if(data.equals("0"))
{
Log.e("RESULT","성공적으로 처리되었습니다!");
alertBuilder
.setTitle("알림")
.setMessage("성공적으로 등록되었습니다!")
.setCancelable(true)
.setPositiveButton("확인", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
AlertDialog dialog = alertBuilder.create();
dialog.show();
}
else
{
Log.e("RESULT","에러 발생! ERRCODE = " + data);
alertBuilder
.setTitle("알림")
.setMessage("등록중 에러가 발생했습니다! errcode : "+ data)
.setCancelable(true)
.setPositiveButton("확인", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
AlertDialog dialog = alertBuilder.create();
dialog.show();
}
}

aSynkTask에서 onPostExecute 메소드를 오버라이드합시다. doInBackground에서는 객체를 생성하는게 안되니 후처리는 onPostExecute에서 해주셔야 됩니다. (전처리는 onPreExecute) 서버에서 내려오는 코드를 가지고 0일경우에는 성공 메시지를, 실패일 경우에는 에러코드와 실패 메시지를 뿌려줍니다.

보통 대고객서비스인 경우는 에러코드 별로 메시지를 다르게 뿌려주지만, 여기서는 하지 않습니다!! (예제이므로..)





 2. 아이디와 비밀번호를 이용해 로그인 하기



 로그인 기능을 구현하는 것은 회원가입 기능과 유사합니다. 다만 다른점은 DB 쿼리에서 INSERT문 대신 SELECT문을 사용하는 것 뿐입니다. 회원가입과 별개로 로그인 php코드를 작성합니다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?
  header('content-type: text/html; charset=utf-8'); 
  // 데이터베이스 접속 문자열. (db위치, 유저 이름, 비밀번호)
  $connect=mysql_connect"db서버주소""아아디""비밀번호") or die( "SQL server에 연결할 수 없습니다.");
 
  mysql_query("SET NAMES UTF8");
  // 데이터베이스 선택
  mysql_select_db("db이름",$connect);
 
  // 세션 시작
  session_start();
 
  $id = $_POST[u_id];
  $sql = "SELECT password FROM USERS WHERE USERID = '$id'";
 
  $result = mysql_query($sql);
 
  // result of sql query
  if($result)
  {
    $row = mysql_fetch_array($result);
    if(is_null($row[password]))
    {
      echo "Can not find ID";
    }
    else
    {
      echo "$row[password]";
    }
  }
  else
  {
   echo mysql_errno($connect);
  }
?>
cs


크롬에서는 php코드가 이쁘게 안나왔는데, 브라우저를 사파리로 바꿨더니 이쁘게 나오네요. 

회원가입과 똑같이 클라이언트에서 POST형식으로 ID를 받고, DB에서 해당 ID의 PASSWORD를 찾아서 리턴해주는 소스입니다.

쿼리 아래 if문은 쿼리가 정상실행이 되지 않았을 때의 예외처리입니다. 회원가입과 다른 점은 SELECT쿼리에서 해당하는 쿼리가 없을 경우에도 정상처리를 출력하기 때문에, SELECT쿼리의 값이 없을때(0개의 row를 리턴했을때)에는 ID를 찾을 수 없다는 메시지를 넣었습니다. 보통 sqlcode에서는 1403을 리턴하면 쿼리가 없는 건데.. PHP는 해당하는 쿼리를 못찾아도 0을 반환하더군요.


아래는 클라이언트에서 로그인php를 호출하는 소스입니다.


public void bt_Login(View v)
{
try{
sId = etId.getText().toString();
}catch (NullPointerException e)
{
Log.e("err",e.getMessage());
}

loginDB lDB = new loginDB();
lDB.execute();

}


public class loginDB extends AsyncTask<Void, Integer, Void> {

@Override
protected Void doInBackground(Void... unused) {

/* 인풋 파라메터값 생성 */
String param = "u_id=" + sId + "";
Log.e("POST",param);
try {
/* 서버연결 */
URL url = new URL(
"http://웹서버주소/login.php");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.connect();

/* 안드로이드 -> 서버 파라메터값 전달 */
OutputStream outs = conn.getOutputStream();
outs.write(param.getBytes("UTF-8"));
outs.flush();
outs.close();

/* 서버 -> 안드로이드 파라메터값 전달 */
InputStream is = null;
BufferedReader in = null;
String data = "";

is = conn.getInputStream();
in = new BufferedReader(new InputStreamReader(is), 8 * 1024);
String line = null;
StringBuffer buff = new StringBuffer();
while ( ( line = in.readLine() ) != null )
{
buff.append(line + "\n");
}
data = buff.toString().trim();

/* 서버에서 응답 */
Log.e("RECV DATA",data);

if(data.equals("0"))
{
Log.e("RESULT","성공적으로 처리되었습니다!");
}
else
{
Log.e("RESULT","에러 발생! ERRCODE = " + data);
}

} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

return null;
}

}

안드로이드에서 edittext에 값이 없을경우 getText() 메소드 때문에 앱이 튕기는 현상이 있습니다. getText()로 널을 빼오면 에러가 나기 때문에, try catch문을 사용해서 null값을 가져올경우를 예외처리 해줍니다.


지금은 회원가입쪽 소스를 복붙해와서 응답값을 에러코드로만 받고있는데, 로그인의 경우 ID로 password를 받아와서 실제 입력한 password와 일치하는지 비교해야 합니다.


여기서 조금 고민을 해야하는데, 비밀번호 비교를 클라이언트에서 해야하는지, 서버에서 해야하는지 입니다.

사실 이 부분에 대해서는 별 생각이 없었는데, 상용화 된 서비스를 (소스를)까보니 서버에서 비교하더라구요. 실질적으로 password라는 정보를 클라이언트에서 다룬다는게 위험할 수 도 있다는 생각이 듭니다. 


따라서 여기서는 서버에서 비교해서 성공여부를 반환하는 걸로 만들겠습니다. (지극히 내 생각 대로 ^오^)


서버에서 비교하려면.. 일단 비밀번호값도 서버로 보내야겠지용.


try{
sId = etId.getText().toString();
sPw = etPw.getText().toString();
}catch (NullPointerException e)
{
Log.e("err",e.getMessage());
}


try catch문에 위와같이 password를 가져오는 부분을 추가하고, 서버에 POST형식으로 보내는 곳에도 추가합니다.

뭐 그냥 회원가입에 쓴건 고대로 쓰면 됩니다. ㅎ_ㅎ


/* 인풋 파라메터값 생성 */
String param = "u_id=" + sId + "&u_pw=" + sPw + "";


자, 이제 클라이언트에서 보낸 값을 서버쪽에서 컨트롤 해 봅시다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?
// 비밀번호 비교
  $sql = "SELECT IF(strcmp(PASSWORD,'$pw'),0,1) pw_chk FROM USERS  WHERE USERID = '$id'";
 
  $result = mysql_query($sql);
 
  // 쿼리 결과
  if($result)
  {
    $row = mysql_fetch_array($result);
    if(is_null($row[pw_chk]))
    {
      echo "Can not find ID";
    }
    else
    {
      echo "$row[pw_chk]";   // 0이면 비밀번호 불일치, 1이면 일치
    }
  }
  else
  {
   echo mysql_errno($connect);
  }
?>
cs


PHP에서 위와같이 코드를 수정해줍니다. 비밀번호를 PHP코드를 이용하기 보다는 쿼리에서 비교할 수 있습니다.

IF문이 생소할 수 있을텐데 (저도 생소함) 오라클에서 사용하는 DECODE와 동일한 기능을 제공합니다. 입력한 패스워드와 DB의 패스워드가 일치하면 1을, 불일치하면 0을 반환합니다.

@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);

if(data.equals("1"))
{
Log.e("RESULT","성공적으로 처리되었습니다!");
alertBuilder
.setTitle("알림")
.setMessage("성공적으로 등록되었습니다!")
.setCancelable(true)
.setPositiveButton("확인", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(MainActivity.this, MainMenu.class);
startActivity(intent);
finish();
}
});
AlertDialog dialog = alertBuilder.create();
dialog.show();
}
else if(data.equals("0"))
{
Log.e("RESULT","비밀번호가 일치하지 않습니다.");
alertBuilder
.setTitle("알림")
.setMessage("비밀번호가 일치하지 않습니다.")
.setCancelable(true)
.setPositiveButton("확인", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//finish();
}
});
AlertDialog dialog = alertBuilder.create();
dialog.show();
}
else
{
Log.e("RESULT","에러 발생! ERRCODE = " + data);
alertBuilder
.setTitle("알림")
.setMessage("등록중 에러가 발생했습니다! errcode : "+ data)
.setCancelable(true)
.setPositiveButton("확인", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//finish();
}
});
AlertDialog dialog = alertBuilder.create();
dialog.show();
}
}


클라이언트에서는 위와같이 수정합니다. 회원가입에 사용했던 AlertDialog도 한꺼번에 적용해 줍니다. 패스워드가 일치할 경우 성공 메시지와 함께 메뉴 액티비티로 넘어갑니다.

비밀번호가 일치하지 않는경우와 다른 에러가 발생한경우는 그대로 머무릅니다. 보통 비밀번호가 일치하지 않는경우 오류횟수를 누적하는 로직이 들어가는데, 여기서는 구현하지 않겠습니다. DB에 오류횟수 컬럼을 추가하고 오류횟수가 몇회 이상 올라가면 로그인을 차단하는 기능을 넣어볼 수 있습니다. 보통 사용서비스에는 모두 들어가 있지요~


위와 같이 알림이 정상적으로 뜨는지 체크하고 넘어갑시다.


3.회원가입시 이메일 보내기


이제 어느정도 회원가입/로그인 기능이 갖추어졌습니다. 하지만! 가장 복잡하고도 어려워보이는 기능인 회원가입시 이메일 보내기! 가 남았습니다.

이부분을 적용시키려면 회원가입로직도 조금 변경해야 합니다. 회원가입 신청시 고유의 키값을 메일로 보내서 그값을 인증할 경우에만 DB에 회원정보가 들어가게 만들어야 하기 때문이죠.


일단 메일을 보내는건 오픈소스를 이용합니다.


바로가기 - http://b.redinfo.co.kr/87


위 블로그에서 소스와 가이드를 잘 읽어보시면 아래와 같은 소스를 통해 간단히 메일을 보낼 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php //sendmail.php
/* 클래스 파일 로드 */
include "Sendmail.php";
 
/* 클래스 객체 변수 선언 */
$sendmail = new Sendmail();
 
/*
 + $to       : 받는사람 메일주소 ( ex. $to="hong <hgd@example.com>" 으로도 가능)
 + $from     : 보내는사람 이름
 + $subject  : 메일 제목
 + $body     : 메일 내용
 + $cc_mail  : Cc 메일 있을경우 (옵션값으로 생략가능)
 + $bcc_mail : Bcc 메일이 있을경우 (옵션값으로 생략가능)
*/
$to="tkdlek11112@gmail.com"
$from="Master";
$subject="메일 제목입니다.";
$body="메일 내용입니다.";
$cc_mail="";
$bcc_mail="";
 
/* 메일 보내기 */
$sendmail->send_mail($to$from$subject$body,$cc_mail,$bcc_mail)
?>
cs


위 소스를 실행하면 실제로 메일이 와있습니다!!



두둥! 이렇게 쉽게 구현되다니 ^오^

하지만 여기서 끝이 아니죠. 메일을 보내는데 메일 내용으로 사용자를 인증하는 기능을 넣어야합니다.

이 부분에 대해서는 보안이 상당히 중요한데요, 일반적인 방법은 메일로 URL을 보내 해당 URL을 클릭하면 DB에 접근해 해당하는 ID에 대해 인증되었다고 업데이트를 해주는 로직이기 때문입니다. 실제로 URL을 통해 DB에 접근하기 때문에 악용될 수가 있습니다.


따라서 해당 URL에 대해 접근 가능한 시간을 두어 1시간 이후 자동 소멸되던지.. 같은 방법을 사용하는데, 뭐 제가 만드는건 그렇게 보안이 필요한게 아니기 때문에 간단하게 만들어 보겠습니다. (암호화따윈 없습니다!)


일단 기본적인 로직은 이렇습니다. 사용자를 관리하는 DB에는 다음과 같이 VERIFY라는 컬럼이 있습니다.


VERIFY컬럼은 기본값으로 N으로 설정되어있는데, 이메일 인증을 하면 Y로 바뀌도록 할 예정입니다. 

로그인할 경우에도 VERIFY값이 'Y'일 때만 로그인 되도록 설정할 예정이구요. 이렇게 되면 회원가입을 해도 인증하지 않는다면 로그인이 되지 않겠지요?


일ㄷ나 저 VERIFY값을 Y로 업데이트치는 소스를 만들어봅시다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 <? //verify.php
    header('content-type: text/html; charset=utf-8'); 
 
    // 데이터베이스 접속 문자열. (db위치, 유저 이름, 비밀번호)
    $connect=mysql_connect"""""") or  
        die( "SQL server에 연결할 수 없습니다.");
 
    
    mysql_query("SET NAMES UTF8");
   // 데이터베이스 선택
   mysql_select_db("DB",$connect);
   // 세션 시작
   session_start();
   $id = $_REQUEST[u_id];
 
   echo "$id";
 
   $sql = "UPDATE USERS SET VERIFY = 'Y' WHERE USERID = '$id'";
 
   $result = mysql_query($sql);
 
   if($result)
   {
    echo "인증되었습니다.";
   }
   else
   {
    echo mysql_errno($connect);
   }
?>
 
cs


URL로 바로 날릴꺼니까 GET방식으로 만들었습니다. 이제 http://서버/verify.php?u_id=인증ID 형식으로 URL을 날리면 DB에 있는 VERIFY값이 Y로 변하는 것을 볼 수 있습니다.



자 이제 회원가입을 하면 mail을 보내는것만 만들면 됩니다.

이전에 만들었던 회원가입 소스를 살짝 고칩시다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 
 <?
    header('content-type: text/html; charset=utf-8'); 
 
      /* 클래스 파일 로드 */
      include "Sendmail.php";
      /* 클래스 객체 변수 선언 */
      $sendmail = new Sendmail();
 
    // 데이터베이스 접속 문자열. (db위치, 유저 이름, 비밀번호)
    $connect=mysql_connect"""""") or  
        die( "SQL server에 연결할 수 없습니다.");
    
    mysql_query("SET NAMES UTF8");
   // 데이터베이스 선택
   mysql_select_db("",$connect);
 
   // 세션 시작
   session_start();
 
   $id = $_POST[u_id];
   $pw = $_POST[u_pw]; 
 
   $sql = "INSERT INTO USERS(USERID, PASSWORD) VALUES('$id', '$pw')";
 
   $result = mysql_query($sql);
 
   $to="$id@gmail.com"
   $from="Master";
   $subject="인증메일입니다.";
   $body="http://choits.iptime.org/snclib_verify.php?u_id=$id";
   $cc_mail="";
   $bcc_mail="";
 
   // result of sql query
   echo mysql_errno($connect);
 
   $sendmail->send_mail($to$from$subject$body,$cc_mail,$bcc_mail);
?>
 
cs

고친다고는 했지만 사실 메일 보내는거만 추가했을 뿐입니다. 저는 id를 메일주소로 받을 생각이었기 때문에 따로 메일주소를 입력하지 않고 id를 메일주소로 사용했습니다. (실제로 사용할 때는 gmail.com이 아니라 회사도메인을 사용할 예정이지만요.) 위와같이 만들면 이제 회원가입을 할 때 인증메일을 함께 보냅니다.


자 이렇게 메일이 오고 선택하면~! N이었던 VERIFY값이 Y로 변합니다.

아까 말한것처럼 GET방식의 호출이기 때문에 URL에 아이디와 서버주소가 드러나게 됩니다. 악용될 경우 해킹의 위험이 있지요. 따라서 암호화나 임의의 난수를 만들어 비비꼬아서 사용합니다 보통은.. 여기서는 안해요 ^오^


생각보다 메일 보내기가 쉽게(?) 끝났지만, 아직 로그인이 정확이 모두 구현된 것은 아닙니다. VERIFY값에 따른 로그인 처리나 비밀번호 오류횟수 등에 대해서는 다음 포스팅에서 다루도록하겠습니다.


아직 기능만 구현한 것이니 마무리는 다음번에 ... ^^


반응형

댓글

Designed by JB FACTORY