쿠키와 세션
웹 사이트에서는 사용자가 어느 페이지로 이동하더라도 특정 정보를 계속해서 유지시켜준다.
예를 들어 쇼핑몰에서 담은 품목들이 사용자가 브라우저를 닫거나, 카트를 비울때까지 유지된다.
보안상 쿠키가 위험함 요소가 될 수 있어 잘 관리해야 한다.
GET/POST를 사용하여 한 사이트의 정보를 다른 사이트로 전해줄 수 있지만 여러 웹 사이트 페이지가 연계 되어 있을 경우 작업이 복잡해 지기 때문에 쿠키는 특정 사이트에 대한 사용자의 동작에 필요한 데이터를 사용자의 컴퓨터에 저장해 놓은 것으로 이렇게 저장된 페이지에서도 원하면 쉽게 접근 할 수 있다.
쿠키는 특수한 형태의 변수로 볼 수 있으며 $userid='Kim'; 으로 변수를 설정하고 다른 php페이지 에서
setcookie("쿠키명", "쿠키값", "만료시간"); 으로 만들어주어 변수로 받을 수 있다.
<9-1.php>
<?php
$result = setcookie("userid", "kim", time() + 60*60*8); // 8시간
if ($result)
echo "쿠키가 잘 생성되었습니다.<br>";
else
echo "쿠키가 생성되지 않았습니다.<br>";
?>
<a href="9-2.php">쿠키 값 확인</a>
<9-2.php>
<?php
$userid = $_COOKIE[userid];
echo "생성된 userid 쿠키의 값 : $userid<br>";
?>
---
한 사이트에 연계되어 있는 여러 페이지에서 데이터를 공유하기 위해서 쿠키를 사용하지만 사용자의 컴퓨터에 파일 형태로 저장되기 때문에 누구나 볼 수 있어 보안에 취약하다.
이런 쿠키의 보안 문제를 해결하기 위해서 PHP4 부터는 세션번수를 사용한다.
클라이언트가 서버에 접속하면 서버는 각 사용자마다 세션 아이디라고 부르는 아이디를 부여하여 폴더를 생성히여 세션 변수 값들을 저장한다. 즉, 데이터가 클라이언트 컴퓨터가 아닌 서버에 저장된다.
session_start(); / $_SESSION[세션변수명] = 값 으로 생성한다.
ex>
<?php
session_start();
$userid = $_SESSION[userid];
echo "세션변수 userid 값 : $userid";
?>
--
login_main.php
<?php
$id = $_COOKIE[id];
if ($id) {
echo "$id님이 로그인하셨습니다.<br>";
echo "<a href=logout.php>로그아웃</a>";
}
else
echo "<form action=login.php method=post>
아이디 : <input type=text name=id><br>
비밀번호 : <input type=password name=pw><br>
<input type=submit value=로그인>
</form>";
?>
login.php
<?php
$id = $_POST[id];
$pw = $_POST[pw];
if ($id == "admin" && $pw == "1234") {
setcookie("id", $id);
header("Location:login_main.php");
}
else
echo "<script> // Java Script
window.alert('아이디 또는 비밀번호가 잘못 입력되었습니다.')
history.go(-1) // history.back()도 있음
</script>";
?>
logout.php
<?php
setcookie("id", " ", time() - 3600);
header("Location:login_main.php");
?>



---
centos
yum -y install httpd mysql-server mysql php php-mysql
chkconfig --level 35 httpd on && chkconfig --level 35 mysqld on
vi /var/www/html/phpinfo.php
setenforce 0
3306 80 443 port open
service mysqld, httpd start
/etc/httpd/conf/httpd.conf 에서
#ServerName ~.example.con:80 을 www.ovor.edu:80 으로 변경
<? php
$db = new mysqli("localhost", "root", "rootoor", "test");
if ($db->connect_errno)
die("Connect Failed: " . $db->connect_error);
$result = $ db->query("show databases;");
echo "<xmp>";
while ($row=$result->fetch_object())
print_r($row);
echo "</xmp>";
$result->close();
$db->close();
?>
create database mine;
vi con.php
<?php
$connect = mysql_connect("localhost", "root", "rootoor");
if (!$connect)
die("DB selection error:" . mysql_error());
mysql_select_db("mine", $connect);
$sql = "CREATE table contacts (";
$sql .="num int not null auto_increment,";
$sql .="name char(12) not null,";
$sql .="addr varchar(80) not null,";
$sql .="phone varchar(20) not null,";
$sql .="primary key(num)";
$sql .=")";
$result = mysql_query($sql, $connect);
if (!$result)
die("Table making failure!<br>");
echo("Table making success!<br>");
mysql_close($connect);
?>
localhost/con.php 실행


---
insert.php
<?php
$connect = mysql_connect("localhost", "root", "rootoor");
if (!$connect)
die("DB selection error:" . mysql_error());
mysql_select_db("mine", $connect);
// 여기서 num은 auto-increment로 설정되어서 별도로 항목 값을 넣지 않았다
$name = array("Kim", "Lee", "Kang", "Noh", "Kweon");
$addr = array("Seoul", "Pusan", "Kwangju", "Incheon", "Chungnam");
$phone = array("111-2222", "222-3333", "333-4444", "444-5555", "555-6666");
for ($i=0; $i < count($name); $i++) {
$sql = "INSERT INTO contacts (name, addr, phone)";
$sql .="VALUES ('$name[$i]', '$addr[$i]', '$phone[$i]')";
$result = mysql_query($sql, $connect);
if (!$result)
die("$i record inserting failure<br>");
}
echo "data record inserting success!<br>";
mysql_close($connect);
?>


---
view_rec.php
<?php
$connect = mysql_connect("localhost", "root", "rootoor");
if (!$connect)
die("DB selection error:" . mysql_error());
mysql_select_db("mine", $connect);
$sql = "SELECT * FROM contacts";
$result = mysql_query($sql, $connect);
$num_fields = mysql_num_fields($result);
?>
<h2>Address Book</h2>
<table width=400>
<tr>
<td>ID</td>
<td>NAME</td>
<td>ADDRESS</td>
<td>PHONE</td>
</tr>
<?php
while ($row = mysql_fetch_row($result)) {
echo "<tr>";
for ($i=0; $i < $num_fields; $i++)
echo "<td>$row[$i]</td>";
echo "</tr>";
}
mysql_close($connect);
?>
</table>

add_person.php
<?php
$connect = mysql_connect("localhost", "root", "rootoor");
if (!$connect)
die("DB access Failure : " . mysql_error());
mysql_select_db("mine", $connect);
$sql = "INSERT INTO contacts (num, name, addr, phone)";
$sql .="VALUES ('$_POST[num]','$_POST[name]','$_POST[addr]','$_POST[phone]')";
mysql_query($sql, $connect);
mysql_close($connect);
header("Location:addr_book.php");
?>
del_person.php
<?php
$connect = mysql_connect("localhost", "root", "rootoor");
if (!$connect)
die("DB access Failure : " . mysql_error());
mysql_select_db("mine", $connect);
$sql = "DELETE FROM contacts WHERE num=$_GET[num]";
mysql_query($sql, $connect);
mysql_close($connect);
header("Location:addr_book.php");
?>
addr_book.php
<?php
$connect = mysql_connect("localhost", "root", "rootoor");
if (!$connect)
die("DB access Failure : " . mysql_error());
mysql_select_db("mine", $connect);
// 정렬 기능을 추가한다
if ($_GET[mode] == "by name")
$sql = "SELECT * FROM contacts ORDER BY binary(name)";
elseif ($_GET[mode] == "by addr")
$sql = "SELECT * FROM contacts ORDER BY binary(addr)";
else
$sql = "SELECT * FROM contacts";
$result = mysql_query($sql, $connect);
?>
<h2>Address Book</h2>
<form action="add_person.php" method="post">
ID : <input type=text size=7 name=id><br>
Name : <input type=text size=12 name=name><br>
Address : <input type=text size=40 name=addr><br>
Phone : <input type=text size=20 name=phone><br>
<input type=submit value="Add">
</form>
<table width=400>
<tr> <td>COUNT</td><td>ID</td><td>NAME</td><td>ADDRESS</td><td>PHONE</td> <td>DELETE</td> </tr>
<?php
// 삭제된 레코드 번호 감추기
$count = 1;
while ($row = mysql_fetch_array($result)) {
echo "<tr>";
echo "<td align=center>$count</td>";
echo "<td align=center>$row[num]</td>";
echo "<td align=center>$row[name]</td>";
echo "<td align=center>$row[addr]</td>";
echo "<td align=center>$row[phone]</td>";
// 삭제 기능 추가. 여기서 X는 삭제 기호를 표시한다
echo "<td align=center><a href=del_person.php?num=$row[num]>X</a></td>";
echo "</tr>";
$count++;
}
mysql_close($connect);
?>
</table>

---
win7
mysqld.exe --skip-grant // mysqld 데몬실행 옵션 - 권한 스킵

이후 mysql 실행
mysql에 데이터 입력
create table freeboard (
num int not null auto_increment,
name varchar(20) not null,
passwd varchar(20) not null,
title varchar(100) not null,
content text not null,
register_day varchar(20),
hits int,
user_ip varchar(20),
primary key(num)
);
insert into freeboard values
(1, "홍길동", '11', '시험용 글 1', '글의 내용', '2020-01-03', 0, '127.0.0.1'),
(2, "이순신", '11', '시험용 글 2', '글의 내용', '2020-01-03', 0, '127.0.0.1'),
(3, "강감찬", '11', '시험용 글 3', '글의 내용', '2020-01-03', 0, '127.0.0.1'),
(4, "김수로", '11', '시험용 글 4', '글의 내용', '2020-01-03', 0, '127.0.0.1'),
(5, "장길산", '11', '시험용 글 5', '글의 내용', '2020-01-03', 0, '127.0.0.1'),
(6, "김수로", '11', '시험용 글 6', '글의 내용', '2020-01-03', 0, '127.0.0.1'),
(7, "홍길동", '11', '시험용 글 7', '글의 내용', '2020-01-03', 0, '127.0.0.1'),
(8, "이순신", '11', '시험용 글 8', '글의 내용', '2020-01-03', 0, '127.0.0.1');
db_connect.php
<?php
$connect = mysql_connect("localhost", "root", "rootoor");
if (!$connect)
die("DB connect Failed : " . mysql_error());
mysql_select_db("centos_db", $connect);
?>
이후 include "db_connect.php"로 사용한다.
freeboard.php
<html>
<head>
<title> 자유게시판 </title>
</head>
<body>
<h3><p align=center>자유게시판</p></h3>
<table width=800 align=center>
<tr bgcolor=cyan>
<td align=center width=80>번호</td>
<td align=center width=420>제목</td>
<td align=center width=100>작성자</td>
<td align=center width=130>작성일</td>
<td align=center width=70>조회수</td>
</tr>
<?php
include "db_connect.php";
// GET/POST로 전달된 값 획득
$page = $_GET[page];
// 게시글 리스트가 모두 몇 페이지가 될지 계산
$num_records_per_page = 5; // 한 페이지에 표시될 레코드 수 설정
$sql = "select count(*) from freeboard"; // 전체 레코드 수 알아내기
$result = mysql_query($sql, $connect);
$num_records = mysql_result($result, 0, 0);
$num_pages = ceil($num_records / $num_records_per_page); // 전체 페이지 수 구하기
// 현재 페이지의 첫번째 레코드 계산
$page = min(max(1, $page), $num_pages); // 1 < 출력할 페이지 번호 < 전체 페이지 수
$start = ($page - 1) * $num_records_per_page; // 출력을 시작할 첫번째 레코드 위치
// 현재 페이지의 레코드들 읽기
$sql = "select * from freeboard order by num desc";
$sql .= " limit $start, $num_records_per_page";
$result = mysql_query($sql, $connect);
// 게시글 리스트 출력
while ($row = mysql_fetch_array($result))
{
echo "<tr>
<td align=center>$row[num]</td>
<td><a href='view.php?num=$row[num]&page=$page'>$row[title]</a></td>
<td align=center>$row[name]</td>
<td align=center>$row[register_day]</td>
<td align=center>$row[hits]</td>
</tr>";
}
mysql_close($connect);
?>
<tr><td colspan=5 height=20></td></tr>
<tr>
<td colspan=5 align=center>
<?php
// 한 화면에 표시할 페이지 번호 링크의 시작과 끝 번호를 계산
$num_links_per_view = 3; // 한 화면에 표시될 페이지 번호의 수
$block = ceil($page / $num_links_per_view); // 현재 화면에 표시할 링크 블럭 번호
$first_link = ($block - 1) * $num_links_per_view + 1; // 첫 번째 링크번호
$last_link = min($first_link + $num_links_per_view - 1, $num_pages); // 마지막 링크번호
// [이전] 링크 출력
if ($first_link != 1)
echo "<a href='freeboard.php?page=" . ($page - $num_links_per_view) . "'>[< 이전]</a>  ";
// 페이지 번호들 출력
for ($i = $first_link; $i <= $last_link; $i++)
{
if ($page == $i)
echo "<b>[$i]</b>  ";
else
echo "<a href='freeboard.php?page=$i'>[$i]</a>  ";
}
// [다음] 링크 출력
if ($last_link != $num_pages)
echo "<a href='freeboard.php?page=" . ($page + $num_links_per_view) . "'>[다음 >]</a>  ";
?>
</td>
</tr>
<tr>
<td colspan=5 align=right><input type=button value=글쓰기
onclick="location.href='write_form.php?page=<?=$page?>'"></td>
</tr>
</table>
</body>
</html>
write_form.php
<html>
<head>
<title> 자유게시판 </title>
</head>
<body>
<h3><p align=center>자유게시판</p></h3>
<form method=post action=write.php>
<table>
<tr>
<td bgcolor=cyan>이름</td>
<td align=left><input type=text name=name size=25
maxlength=16 value=''></td>
</tr>
<tr>
<td bgcolor=cyan>비밀번호</td>
<td align=left><input type=password name=passwd size=25
maxlength=16></td>
</tr>
<tr>
<td bgcolor=cyan>제목</td>
<td align=left><input type=text name=title size=50
maxlength=100 value=''></td>
</tr>
<tr>
<td bgcolor=cyan>내용</td>
<td align=left><textarea name=content cols=74 rows=14
wrap=virtual></textarea>
</td>
</tr>
<tr>
<td><input type=submit value=글등록></td>
<td><input type=button value=목록보기
onclick="location.href='freeboard.php?page=<?=$_GET[page]?>'"></td>
</tr>
</table>
</form>
</body>
</html>
write.php
<?php
include "db_connect.php";
// GET/POST로 전달된 값 획득
$name = $_POST[name];
$passwd = $_POST[passwd];
$title = $_POST[title];
$content = $_POST[content];
if ($name && $passwd && $title && $content)
{
// 작성일, 작성자 IP 얻기
$register_day = date("Y-m-d");
$user_ip = $_SERVER[REMOTE_ADDR];
// 쿼리 실행
$sql = "insert into freeboard";
$sql .= " (name, passwd, title, content, register_day, hits, user_ip)";
$sql .= " values('$name', '$passwd', '$title', '$content',";
$sql .= " '$register_day', 0, '$user_ip')";
mysql_query($sql, $connect);
mysql_close();
// 메인 페이지로 돌아감
header("Location:freeboard.php");
}
else
echo "<script>
alert('이름, 비밀번호, 제목, 내용이 모두 입력되어야 합니다.');
history.back();
</script>";
?>
view.php
<?php
include "db_connect.php";
// GET/POST로 전달된 값 획득
$num = $_GET[num];
$page = $_GET[page];
// 지정된 번호의 글 데이터 읽기
$sql = "select * from freeboard where num=$num";
$result = mysql_query($sql, $connect);
$row = mysql_fetch_array($result);
// 제목의 공백, 본문의 공백과 줄넘김이 웹에서 보이도록 처리
$row[title] = str_replace(" ", " ", $row[title]);
$row[content] = str_replace(" ", " ", $row[content]);
$row[content] = str_replace("\n", "<br>", $row[content]);
// 조회 수 1 증가
$sql = "update freeboard set hits=hits+1 where num=$row[num]";
mysql_query($sql, $connect);
mysql_close();
?>
<html>
<head>
<title> 자유게시판 </title>
</head>
<body>
<h3><p align=center>자유게시판</p></h3>
<table width=800 align=center>
<tr>
<td bgcolor=cyan width=70>제목</td>
<td><? echo $row[title]; ?></td>
</tr>
<tr>
<td bgcolor=cyan>작성자</td>
<td><? echo $row[name]; ?></td>
</tr>
<tr>
<td bgcolor=cyan>IP</td>
<td><? echo $row[user_ip]; ?></td>
</tr>
<tr>
<td bgcolor=cyan>내용</td>
<td><? echo $row[content]; ?></td>
</tr>
<tr>
<td></td>
<td>
<input type=button value=수정
onclick="location.href='modify_form.php?num=<?=$num?> &page=<?=$page?>'">
<input type=button value=삭제
onclick="location.href='passwd_form.php?num=<?=$num?> &page=<?=$page?>'">
<input type=button value=목록보기
onclick="location.href='freeboard.php?page=<?=$page?>'">
</td>
</tr>
</table>
</body>
</html>
modify_form.php
<?php
include "db_connect.php";
// GET/POST로 전달된 값 획득
$num = $_GET[num];
$page = $_GET[page];
// 지정된 번호의 글 데이터 읽기
$sql = "select * from freeboard where num=$num";
$result = mysql_query($sql, $connect);
$row = mysql_fetch_array($result);
// 제목의 공백, 본문의 공백과 줄넘김이 웹에서 보이도록 처리
$row[title] = str_replace(" ", " ", $row[title]);
$row[content] = str_replace(" ", " ", $row[content]);
mysql_close();
?>
<html>
<head>
<title> 자유게시판 </title>
</head>
<body>
<h3><p align=center>자유게시판</p></h3>
<form method=post action='modify.php?num=<?=$num?>&page=<?=$page?>'>
<table>
<tr>
<td bgcolor=cyan>이름</td>
<td align=left><input type=text name=name size=25
maxlength=16 value='<?=$row[name]?>'></td>
</tr>
<tr>
<td bgcolor=cyan>비밀번호</td>
<td align=left><input type=password name=passwd size=25
maxlength=16></td>
</tr>
<tr>
<td bgcolor=cyan>제목</td>
<td align=left><input type=text name=title size=50
maxlength=100 value='<?=$row[title]?>'></td>
</tr>
<tr>
<td bgcolor=cyan>내용</td>
<td align=left><textarea name=content cols=74 rows=14
wrap=virtual><?=$row[content]?></textarea>
</td>
</tr>
<tr>
<td><input type=submit value=글등록></td>
<td><input type=button value=목록보기
onclick="location.href='freeboard.php?page=<?=$page?>'"></td>
</tr>
</table>
</form>
</body>
</html>
passwd_form.php
<?php
// GET/POST로 전달된 값 획득
$num = $_GET[num];
$page = $_GET[page];
?>
<html>
<head>
<title> 자유게시판 </title>
</head>
<body>
<h3><p align=center>자유게시판</p></h3>
<form method=post action="delete.php?num=<?=$num?>&page=<?=$page?>">
비밀번호를 입력하세요.<br>
비밀번호 : <input type=password name="passwd" size=25 maxlength=16><br><br>
<input type=submit value=삭제>
<input type=button value=취소 onclick="history.back()">
</form>
</body>
</html>
delete.php
<?php
include "db_connect.php";
// GET/POST로 전달된 값 획득
$num = $_GET[num];
$page = $_GET[page];
$passwd = $_POST[passwd];
// 지정된 번호와 비밀번호를 가진 레코드를 읽어 옴(비밀번호 확인 목적)
$sql = "select * from freeboard where num=$num and passwd='$passwd'";
$result = mysql_query($sql, $connect);
$row = mysql_fetch_array($result);
if (mysql_num_rows($result)) // 번호, 비밀번호가 맞는 레코드가 있으면 삭제
mysql_query("delete from freeboard where num=$num", $connect);
else
echo "<script>
alert('비밀번호가 틀렸습니다.');
history.back();
</script>";
mysql_close();
// 메인 페이지로 돌아감
header("Location:freeboard.php?page=$page");
?>
---






---
Windows 서버 : Server 2016이 가장 최신버전이며 2012, 2008이 사용되고있다.
Windows Server는 다중 사용자 시스템, software RAID 지원, 강력한 네트워크 지원, 데이터 백업, 외부에서 서버 접속, 데이터베이스 설치, IIS(Internet Information System)을 통한 Web과 FTP 서버 설치, DNS(Active Diretory 설정 시 도메인이 있어야 함으로), E-mail 서비스(무료 hMailServer와 MS Exchange 서버), DHCP 서버, 파일서버, 도메인 설정(AD<=group,m OU), .. 이 가능하다.
가상화 (hyper-V), Server Core(Linux runlevel 3처럼 그래픽 없이 명령어로 Windows 서버를 운영할 수 있다.
리소스가 매우 적으며 보안성이 올라간다.)
=> Windows7부터 Power Shell(Linux의 Shell scripts)가 내장되어 있다.
RoDC(Read only Domain Controller / ) 도 있다.
** GP0(Group Policy Object) 설정,
Domain 구축 가능 <= trust 관계,
Terminal 서비스 구축 <= 하나의 서버 서비스로 여러 클라이언트들이 공유해서 사용
---
Win_ser1(p@ssw0rd1) : 192.168.111.170 생성(win_ser 2008)
Win_ser1(p@ssw0rd1) : 192.168.111.171 생성(win_ser 2008)
Win_ser1(p@ssw0rd1) : 192.168.111.172 생성(win_ser 2008)
Win_7 : 192.168.111.200 생성
Win_10 : 192.168.111.201 생성
DNS (192.168.111.2/168.126.63.1)
Gateway (192.168.111.2)
Domain (a.paul.edu , b.paul.edu / RoDC로 b.paul.edu)