3주차 과제
- 식별 / 인증 동시
- 식별 / 인증 분리
- 식별 / 인증 동시 (+ 비밀번호 HASH)
- 식별 / 인증 분리 (+ 비밀번호 HASH)
로그인에 대해 작성된 아래 글의 로그인 로직을 좀 더 자세히 구현할 것이다.
로그인 로직은 2주차에 구현해놓은 login_proc.php을 수정하여 작성했다.
1. 식별 / 인증 동시
login1.php
<?php
session_start();
include "db_conn.php";
$id = $_POST['id'];
$pw = $_POST['pw'];
//일치하는 식별정보와 인증정보가 존재하는지 확인
$sql = "select * from regist where userid='$id' and userpw='$pw'";
$result = mysqli_query($db_conn, $sql);
$row = mysqli_fetch_array($result);
if($row){ // 쿼리 결과가 존재하면 로그인 성공
$_SESSION['name'] = $row['username'];
mysqli_close($db_conn);
header("Location: index.php");
}else{ // 존재하지 않으면 로그인 실패
echo "<script>
alert(\"비밀번호가 일치하지 않습니다.\");
history.back();
</script>";
exit;
}
?>
2. 식별 / 인증 분리
login2.php
<?php
session_start();
include "db_conn.php";
$id = $_POST['id'];
$pw = $_POST['pw'];
// 식별 정보(id)만 이용하여 일치하는 데이터 있는지 검사
$sql = "select * from regist where userid='$id'";
$result = mysqli_query($db_conn, $sql);
$row = mysqli_fetch_array($result);
if(!$row){ // id 존재 여부 확인 ==> 식별
echo "<script>
alert(\"일치하는 아이디가 없습니다.\");
history.back();
</script>";
exit;
} else{ // 일치하는 id가 있으면, 인증정보(pw) 확인 ==> 인증
if($row['userpw'] != $pw){ // pw 일치하지 않으면 로그인 실패
echo "<script>
alert(\"비밀번호가 일치하지 않습니다.\");
history.back();
</script>";
exit;
}else{ // pw 일치하면 로그인 성공
$_SESSION['name'] = $row['username'];
mysqli_close($db_conn);
header("Location: index.php");
}
}
?>
위의 방식에 비밀번호 해시를 추가한 3, 4번 방식을 구현하기 전에, 회원가입 시 해시화된 비밀번호가 db에 저장되도록 회원가입 처리 코드를 변경하였다.
HashRegist_proc.php
<?php
include "db_conn.php";
$pw = $_POST['pw'];
// sha256 알고리즘으로 비밀번호 해시값 구하기
$hashed_passwd = hash('sha256', $pw);
// 비밀번호 평문이 아닌 해시값 저장
$sql = "insert into regist values(null, '{$_POST['name']}', '{$_POST['id']}', '$encrypted_passwd', now())";
$result = mysqli_query($db_conn, $sql);
if($result === false){ /* === 이면 자료형까지 일치하는지 확인 */
echo "저장에 문제가 생겼습니다. 관리자에게 문의 바랍니다.";
echo mysqli_error($db_conn);
} else{?>
<script>
alert("회원가입이 완료되었습니다.")
location.href="index.php"
</script>;
<?php
}
?>
php의 hash 함수로 비밀번호의 해시값을 구했다. hash 함수의 사용은 다음과 같다.
hash ( string $algo , string $data, [ bool $raw_output = false ] )
- $algo : 해시 알고리즘 (md5, sha256 ...)
- $data : 해시 알고리즘을 적용할 데이터
- $raw_output : TRUE일 경우 바이너리 데이터로 결과 반환, FALSE일 경우 소문자 hex 값으로 반환
해시 알고리즘은 md5보다 안전한 sha256을 이용하였다. (md5는 충돌 문제도 존재한다고 한다.)
3. 식별 / 인증 동시 (+ HASH)
login3.php
<?php
session_start();
include "db_conn.php";
$id = $_POST['id'];
$pw = $_POST['pw'];
// sha256 알고리즘으로 pw의 해시값 구하기
$hashed_pw = hash('sha256', $pw);
// 일치하는 식별정보와 인증정보가 존재하는지 확인
$sql = "select * from regist where userid='$id' and userpw='$hashed_pw'";
$result = mysqli_query($db_conn, $sql);
$row = mysqli_fetch_array($result);
if($row){
$_SESSION['name'] = $row['username'];
mysqli_close($db_conn);
header("Location: index.php");
}else{
echo "<script>
alert(\"비밀번호가 일치하지 않습니다.\");
history.back();
</script>";
exit;
}
?>
4. 식별 / 인증 분리 (+ HASH)
login4.php
<?php
session_start();
include "db_conn.php";
$id = $_POST['id'];
$pw = $_POST['pw'];
// sha256 알고리즘으로 비밀번호 해시값 구하기
$hashed_pw = hash('sha256', $pw);
// 식별 정보(id)만 이용하여 일치하는 데이터 있는지 검사
$sql = "select * from regist where userid='$id'";
$result = mysqli_query($db_conn, $sql);
$row = mysqli_fetch_array($result);
if(!$row){ // id 존재 여부 확인 ==> 식별
echo "<script>
alert(\"일치하는 아이디가 없습니다.\");
history.back();
</script>";
exit;
} else{ // 일치하는 id가 있으면, 인증정보(pw) 확인 ==> 인증
if($row['userpw'] != $hashed_pw){ // pw 일치하지 않으면 로그인 실패
echo "<script>
alert(\"비밀번호가 일치하지 않습니다.\");
history.back();
</script>";
exit;
}else{ // pw 일치하면 로그인 성공
$_SESSION['name'] = $row['username'];
mysqli_close($db_conn);
header("Location: index.php");
}
?>
'웹 모의해킹 스터디 > 웹 개발 (PHP | MySQL)' 카테고리의 다른 글
[php/mysql] 게시판 글 작성 구현하기 (3) | 2023.11.21 |
---|---|
[php/mysql] 게시판 리스트 구현하기 (메인 페이지) (0) | 2023.11.21 |
[php / mysql] 세션(session)을 이용한 로그인 / 로그아웃 구현 (0) | 2023.11.17 |
[php / mysql] 로그인 / 회원가입 페이지 만들기 (3) | 2023.11.13 |
[1주차] [html / css] 로그인 페이지 만들기 (1) | 2023.11.01 |