수많은 데이터에서 특정 데이터를 찾아내는 것이다.
식별정보는 중복값이면 안되고 unique 해야하며
누출되도 상관없는 정보이다.
ex) ID,이메일주소
사용자가 제공한 정보가 실제로 사용자의 것인지 확인하는 것이다.
인증정보는 누출되면 위험하다.
ex)비밀번호
로그인 할때는 식별(ID)과 인증(PW)이 함께 이루어진다.
join_us_proc.php (회원가입 페이지 process)
<DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" href="style.css">
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/reset-css@4.0.1/reset.min.css"
/>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div class ='join_box'>
<?php
// 데이터베이스 연결 설정
$servername = "localhost";
$username = "admin";
$password = "student1234";
$dbname = "login_info";
// 데이터베이스에 연결
$conn = new mysqli($servername, $username, $password, $dbname);
// 연결 확인
if ($conn->connect_error) {
die("연결 실패: " . $conn->connect_error);
}
$id = $_POST['new_id'];
$PW = $_POST['new_PW'];
$email = $_POST['new_email'];
$birth = $_POST['new_birth'];
// SQL 쿼리 작성하여 데이터베이스에 값 추가
$sql = "SELECT * FROM login_table WHERE id='$id'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// 중복된 아이디가 이미 존재하는 경우
echo "<div class='message'>이미 사용 중인 아이디입니다.</div>";
} else {
// 아이디가 중복되지 않은 경우, 회원가입 처리 등 추가 작업 수행
$sql2 = "INSERT INTO login_table(id,PW,email,birth) VALUES ('$id','$PW','$email','$birth')";
if ($conn->query($sql2) === TRUE) {
echo "<div class='message'>회원가입이 완료되었습니다.</div>";
} else {
echo "오류: " . $sql . "<br>" . $conn->error;
}
}
// 데이터베이스 연결 닫기
$conn->close();
?>
<div class="go_login_box"><a href = "index.html"><button class="go_login">login</button></a></div>
</div>
</body>
</html>
login_proc.php (로그인 페이지 process)
<?php
//세션시작
session_start();
$servername = "localhost";
$username = "admin";
$password = "student1234";
$dbname = "login_info";
$conn = new mysqli($servername, $username, $password, $dbname);
// 클라이언트에서 입력한 아이디와 비밀번호 받기
$login_id = $_POST['id'];
$login_password = $_POST['passwd'];
// SQL 쿼리를 통해 데이터베이스에서 사용자 정보 가져오기
$sql = "SELECT * FROM login_table WHERE id = '$login_id' && PW = '$login_password'";
$result = $conn->query($sql);
// 결과 확인 후 로그인 처리
if ($result->num_rows > 0) {
// 로그인 성공
$_SESSION['loggedin'] = true;
$_SESSION['username'] = $login_id;
// 로그인 후 리다이렉트할 페이지로 이동
header('Location: dashboard.php');
exit;
} else {
// 아이디나 비밀번호가 일치하지 않을 경우
echo "<div class='message'>아이디 혹은 비밀번호가 일치하지 않습니다.</div>";
}
// 데이터베이스 연결 종료
$conn->close();
?>
login_proc.php (로그인 페이지 process)
<?php
//세션시작
session_start();
$servername = "localhost";
$username = "admin";
$password = "student1234";
$dbname = "login_info";
$conn = new mysqli($servername, $username, $password, $dbname);
// 클라이언트에서 입력한 아이디와 비밀번호 받기
$login_id = $_POST['id'];
$login_password = $_POST['passwd'];
//식별,인증 분리
// SQL 쿼리를 통해 데이터베이스에서 사용자 정보 가져오기
$sql = "SELECT * FROM login_table WHERE id = '$login_id'";
$result = $conn->query($sql);
// 결과 확인 후 로그인 처리
if ($result->num_rows > 0) {
// 사용자가 입력한 비밀번호와 데이터베이스에서 가져온 비밀번호 비교
$row = $result->fetch_assoc();
if ($login_password == $row['PW']) {
// 로그인 성공
$_SESSION['loggedin'] = true;
$_SESSION['username'] = $login_id;
// 로그인 후 리다이렉트할 페이지로 이동
header('Location: dashboard.php');
exit;
} else {
// 비밀번호가 일치하지 않을 경우
echo "<div class='message'>비밀번호가 일치하지 않습니다.</div>";
}
} else {
// 사용자가 입력한 아이디가 데이터베이스에 존재하지 않을 경우
echo "<div class='message'>계정이 존재하지 않습니다.</div>";
}
// 데이터베이스 연결 종료
$conn->close();
?>
🔎설명
join_us_proc_hash.php (회원가입 페이지 process)
<DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" href="style.css">
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/reset-css@4.0.1/reset.min.css"
/>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div class ='join_box'>
<?php
// 데이터베이스 연결 설정
$servername = "localhost";
$username = "admin";
$password = "student1234";
$dbname = "login_info";
// 데이터베이스에 연결
$conn = new mysqli($servername, $username, $password, $dbname);
// 연결 확인
if ($conn->connect_error) {
die("연결 실패: " . $conn->connect_error);
}
$id = $_POST['new_id'];
$PW = $_POST['new_PW'];
$email = $_POST['new_email'];
$birth = $_POST['new_birth'];
//hash처리된 비밀번호
$hashed_pw = hash('sha256', $PW);
// SQL 쿼리 작성하여 데이터베이스에 값 추가
$sql = "SELECT * FROM login_table WHERE id='$id'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// 중복된 아이디가 이미 존재하는 경우
echo "<div class='message'>이미 사용 중인 아이디입니다.</div>";
} else {
// 아이디가 중복되지 않은 경우, 회원가입 처리 등 추가 작업 수행
$sql2 = "INSERT INTO login_table(id,PW,email,birth) VALUES ('$id','$hashed_pw','$email','$birth')";
if ($conn->query($sql2) === TRUE) {
echo "<div class='message'>회원가입이 완료되었습니다.</div>";
} else {
echo "오류: " . $sql . "<br>" . $conn->error;
}
}
/*if ($conn->query($sql) === TRUE) {
echo "회원가입이 완료되었습니다.<br>";
} else {
echo "오류: " . $sql . "<br>" . $conn->error;
}*/
// 데이터베이스 연결 닫기
$conn->close();
?>
<div class="go_login_box"><a href = "index.html"><button class="go_login">login</button></a></div>
</div>
</body>
</html>
login_proc_hash.php
<?php
//세션시작
session_start();
$servername = "localhost";
$username = "admin";
$password = "student1234";
$dbname = "login_info";
$conn = new mysqli($servername, $username, $password, $dbname);
// 클라이언트에서 입력한 아이디와 비밀번호 받기
$login_id = $_POST['id'];
$login_password = $_POST['passwd'];
//식별,인증 동시 sha 256사용
// 로그인 비밀번호 해시처리
$hashed_password = hash('sha256', $login_password);
// SQL 쿼리를 통해 데이터베이스에서 사용자 정보 가져오기
$sql = "SELECT * FROM login_table WHERE id = '$login_id' && PW = '$hashed_password' ";
$result = $conn->query($sql);
// 로그인 비밀번호 해시처리
$hashed_password = hash('sha256', $login_password);
// 결과 확인 후 로그인 처리
if ($result->num_rows > 0) {
// 사용자가 입력한 비밀번호와 데이터베이스에서 가져온 비밀번호 비교
// 로그인 성공
$_SESSION['loggedin'] = true;
$_SESSION['username'] = $login_id;
// 로그인 후 리다이렉트할 페이지로 이동
header('Location: dashboard1.php');
exit;
} else {
// 사용자가 입력한 값의 아이디 혹은 비밀번호가 다름
echo "<div class='message'>아이디 혹은 비밀번호가 다르거나 존재하지 않습니다.</div>";
}
// 데이터베이스 연결 종료
$conn->close();
?>
login_proc_hash.php
<?php
//세션시작
session_start();
$servername = "localhost";
$username = "admin";
$password = "student1234";
$dbname = "login_info";
$conn = new mysqli($servername, $username, $password, $dbname);
// 클라이언트에서 입력한 아이디와 비밀번호 받기
$login_id = $_POST['id'];
$login_password = $_POST['passwd'];
// 식별,인증 분리 sha-256사용
// SQL 쿼리를 통해 데이터베이스에서 사용자 정보 가져오기
$sql = "SELECT * FROM login_table WHERE id = '$login_id'";
$result = $conn->query($sql);
// 로그인 비밀번호 해시처리
$hashed_password = hash('sha256', $login_password);
// 결과 확인 후 로그인 처리
if ($result->num_rows > 0) {
// 사용자가 입력한 비밀번호와 데이터베이스에서 가져온 비밀번호 비교
$row = $result->fetch_assoc();
$DB_pw = $row['PW'];
if ($hashed_password === $DB_pw) {
// 로그인 성공
$_SESSION['loggedin'] = true;
$_SESSION['username'] = $login_id;
// 로그인 후 리다이렉트할 페이지로 이동
header('Location: dashboard1.php');
exit;
} else {
// 비밀번호가 일치하지 않을 경우
echo "사용자 ID :"."$login_id";
echo "해시값 : "."$hashed_password";
echo "<div class='message'>비밀번호가 일치하지 않습니다.</div>";
}
} else {
// 사용자가 입력한 아이디가 데이터베이스에 존재하지 않을 경우
echo "<div class='message'>계정이 존재하지 않습니다.</div>";
}
// 데이터베이스 연결 종료
$conn->close();
?>
회원가입 후 DB에 비밀번호 hash값으로 저장된 것 확인
(게시판 구현은 아직이다.. )
+) 처음에는 password_hash(); 함수를 사용하였다.
$password = "입력된 패스워드";
$hashed_password = password_hash($password, PASSWORD_DEFAULT);
PASSWORD_DEFAULT : Bcrypt알고리즘을 사용한다. 해시를 생성할 때 임의의 salt값을 사용하여 무작위성을 증가 시킨다.
그래서 password_hash()를 사용하면 salt값 때문에 해시값이 다르게 생성된다
예를 들어 $login_hash_pass === $DB_hash_pass 이런식으로 비교하면 당연히 다르게 나온다..
그래서 password_verify() 를 사용해야한다.
password_verify($login_pass,$DB_hash_pass)
$login_pass 와 $DB_hash_pass를 비교하여 일치하면 true, 일치하지 않으면 false를 반환한다.
하지만 이걸로 식별/인증 동시 구현할 방법이 떠오르지 않아
대신 hash('sha256', $str); 를 이용하였다.
참고자료
https://octatco.com/blog=34
https://homesi.tistory.com/entry/%EC%95%94%ED%98%B8%ED%99%94-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%ACphpass-05