[PHP] OTP와 로그 시스템 (OTP and Log System)
root at 127.0.0.1
이번에 소개할 것은 OTP와 IP로그 시스템에 관해서 심도적으로 소개하려고 한다.
사용자 인터페이스 관점에서의 OTP는 크게 하드웨어와 소프트웨어로 분류할 수 있다고 가설을 두고 설계하였다.
보안 이슈에서 OTP 시스템이 도입된 지 불과 몇 년 되지 않았다고 본다.
IP 로그와 OTP 시스템의 차이점을 소개하겠다.
1. OTP란?
One time Password라는 용어로 일회성 비밀번호를 생성하는 시스템이라고 부른다.
예를 들면, 사용자가 보유하고 있는 비밀번호 체계로 인증체계를 구현할 때 사용되어진다.
2. 사용자 인터페이스 설계하기(Designing the User Interface)
사용자 관점에서 "OTP" 인터페이스를 고안하였다.
크게 어렵지 않은 인터페이스 화면으로 디자인 할 수 있다.
그림 2-1. 소프트웨어 - OTP Generator(OTP 생성기) - 도도(Dodo) 그림 2-1은 소프트웨어 형태의 OTP 생성기이다.
그림 2-2. 하드웨어 OTP Generator(Hardware OTP Generator) - 도도(Dodo)
그림 2-2는 하드웨어 형태의 OTP 생성기이다.
3. 웹 페이지에서의 OTP 생성하기(Creating an OTP on a Web Page)
아래의 그림은 웹 페이지에서 OTP를 생성하는 것이다.
그림 3-1. OTP 생성 구현의 예 - 도도(Dodo)
OTP 생성에 관한 소스코드이다. 크게 어렵지 않은 구조로 작성할 수 있다.
<?php /* * Created Date : 2018-08-29 * Filename: index.php * Author: Dodo */ ?> <?php function generate(){ return time() * mt_rand(1, 5); } ?> <!DOCTYPE html> <html lang="ko"> <head> <meta name="viewport" content="width=320; user-scalable=no" /> <meta http-equiv="Content-type" content="text/html; charset=utf-8"> <title>OTP 발생기(OTP Generator)</title> <link rel="stylesheet" type="text/css" href="./css/mystyle.css"> </head> <body> <!-- OTP Generator Model --> <table style="width: 100%;"> <tr> <td style="background-color: #FA5882; height:40px"> <span style="font-size:20px; color:#FFF; font-weight:bold;"> OTP Generator(OTP 생성기) </span> </td> </tr> <tr> <td> <input type="text" class="otp" name="otp" value="<?php echo generate(); ?>" style="width:100%;height:30px;"> </td> </tr> <tr> <td> <input type="submit" class="generate" value="생성하기" onclick="window.location.reload();"> </td> </tr> </table> </body> </html>
영상 1. OTP 생성기 / 시연 - 도도(Dodo)
4. 웹 페이지에서 로그
웹 페이지에서 사용자 로그를 생성하는 것에 대해서 소개한다.
CREATE TABLE IF NOT EXISTS `log` ( `id` int(11) NOT NULL auto_increment, `createDate` datetime NOT NULL, `subject` text NOT NULL, `ip` text NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
데이터베이스의 테이블 설계는 다음과 같이 간단한 구조로 설계할 수 있다.
PHP 로그(Log) - 더보기 PHP 로그(Log) - 숨기기
<?php /* * Created Date : 2018-08-29 * Filename: log.php * Author: Dodo */ ?>
<?php
function getUserDate(){ return date("Y-m-d H:m:s"); }
function remoteIpAddr(){ return $_SERVER["REMOTE_ADDR"]; }
function insertLog($createDate, $subject, $ip){ $link = mysql_connect('localhost', 'root', 'apmsetup'); if (!$link) { die('Could not connect: ' . mysql_error()); } //echo 'Connected successfully'; // make foo the current db $db_selected = mysql_select_db('otp', $link); if (!$db_selected) { die ('Can\'t use foo : ' . mysql_error()); } mysql_query("SET NAMES 'utf8'"); mysql_query("SET CHARACTER SET utf8 "); $query = sprintf("INSERT INTO `log` ( `id` , `createDate` , `subject` , `ip` )" . " VALUES ( NULL , '%s', '%s', '%s' );", mysql_real_escape_string($createDate), mysql_real_escape_string($subject), mysql_real_escape_string($ip)); // Perform Query $result = mysql_query($query, $link); if (!$result) { $message = 'Invalid query: ' . mysql_error() . "\n"; $message .= 'Whole query: ' . $query; die($message); } mysql_close($link); }
?> <!DOCTYPE html> <html lang="ko"> <head> <meta name="viewport" content="width=320; user-scalable=no" /> <meta http-equiv="Content-type" content="text/html; charset=utf-8"> <title>로그 생성기(Log Generator)</title> <link rel="stylesheet" type="text/css" href="./css/mystyle.css"> </head> <body>
<?php insertLog(getUserDate(), '로그생성', remoteIpAddr()); ?> <!-- Log Generator Model --> <table style="width: 100%;"> <tr> <td colspan="2" style="background-color: #FA5882; height:40px"> <span style="font-size:20px; color:#FFF; font-weight:bold;"> 로그 생성기(Log Generator) </span> </td> </tr> <tr> <td style="border-bottom:1px solid #e2e2e2;"> <span style="font-size:13px; color:999; font-weight:bold; text-valign:center;"> 접속 일자 및 시간 </span> </td> <td style="border-bottom:1px solid #e2e2e2;"> <span style="font-size:13px; color:999; font-weight:bold; text-valign:center;"> 아이피 주소 </span> </td> </tr> <tr> <td style="border-bottom:1px solid #e2e2e2;"> <span style="font-size:13px; color:999;"> <?php echo getUserDate(); ?> </span> </td> <td style="border-bottom:1px solid #e2e2e2;"> <span style="font-size:13px; color:999;"> <?php echo remoteIpAddr(); ?> </span> </td> </tr> </table>
</body> </html>
PHP 로그(Log) - 숨기기
위의 코드를 실행하면 아래처럼 반응하는 것을 볼 수 있다.
그림 4-1. 웹 페이지에서의 로그 - 도도(Dodo)
영상 2. 로그 생성 반응 시연 - 도도(Dodo)
5. 아파치 웹 서버
아파치 웹 서버는 아파치 파운데이션(Apache Foundation)에서 만든 프로젝트이다.
http://www.apache.org
그림 5-1. 아파치 소프트웨어 재단(Apache Software Foundation) - 도도(Dodo)
표 1. 영어, 한글로 읽어보기
번호
영어 단어
뜻
한글 읽기(Hangul)
1
Open
개방, 열다
오픈
2
Software
소프트웨어
소프트웨어
3
Soft
부드러운
소프트
4
Innovation
혁신
이노베이션
5
Community
커뮤니티(공동체)
커뮤니티
6
Consider
고려하다, 중히 여기다
컨시더
그림 5-2. 아파치 프로젝트 소개 - 도도(Dodo)
표 2. 영어, 한글로 읽어보기
번호
영어 단어 또는 문장
뜻
한글 읽기
1
What is the Apache HTTP Server Project?
아파치 HTTP 서버 프로젝트는 무엇입니까?
왓 이스 더 아파치 에이치티티피
서버 프로젝트?
2
The Apache HTTP Server Project is a collaborative software development
Apache HTTP Server 프로젝트는 공동 소프트웨어 개발입니다.
디 아파치 에이치티티피 서버 프로젝트 이스 어 콜라브레이티브 소프트웨어 디벨러프멘트.
3
Collaborative
공동
콜라보레이티브
4
effort
노력
에포트
5
Mailing Lists
메일링 리스트
메일링 리스트
6
Trunk (dev)
트렁크 (개발)
뜻(의역): 저장 보관소
트렁크 (디브)
6. 맺음글(Conclusion)
OTP 시스템과 로그 시스템에 대해서 살펴보았다.
7. 참고자료(Reference)
1. OTP, Last Modified , Accessed by 2018-08-29, https://ko.wikipedia.org/wiki/ 일회용 비밀번호
2. PHP: mysql_query, Last Modified, Accessed by 2018-08-29, http://php.net/manual/en/function.mysql-query.php
3. PHP: mysql_set_charset - Manual, Last Modified, Accessed by 2018-08-29, http://php.net/manual/en/function.mysql-set-charset.php
4. Welcome to The Apache Software Foundation!, Last Modified, Accessed by 2018-08-29, https://www.apache.org/
5. About the Apache HTTP Server Project - The Apache HTTP Server Project, Last Modified, Accessed by 2018-08-29, http://httpd.apache.org/ABOUT_APACHE.html
Editor: 도도는 도도의 초록누리의 에디터이다. 샵인클루드 족이다.