정보통신망법, 개인정보보호법 등에 의하면 비밀번호는 단방향암호화(SHA256 등), 개인정보는 양방향암호화(AES256 등)를 하도록 되어 있습니다. 지금까지 작성한 예제는 이런 법에 맞지 않아서 서비스할 수 없겠네요. 여기에서는 비밀번호의 단방향 암호화를 구현해보도록 하겠습니다. SHA256을 적용하겠습니다. PHP(Laravel)에서는 아무런 작업을 하지 않고, DB(MySQL)에서만 작업을 하겠습니다.

 

1. 일단 DBMS에 접속해봅니다.

$ mysql -u xyz -pxyz123 xyz
mysql: [Warning] Using a password on the command line interface can be insecure.
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 282
Server version: 8.0.26-0ubuntu0.20.04.2 (Ubuntu)
 
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql>

 

2. Admins 테이블에 있는 모든 항목을 삭제합니다.

mysql> CALL listAdmins();
+-----+---------+-----------+-------+
| sno | userid  | password  | nick  |
+-----+---------+-----------+-------+
|   1 | testid1 | passwd101 | nick1 |
|   2 | testid2 | passwd2   | nick2 |
|   3 | testid3 | passwd3   | nick3 |
+-----+---------+-----------+-------+
3 ROWS IN SET (0.00 sec)
 
Query OK, 0 ROWS affected (0.00 sec)
 
mysql> DELETE FROM admins;
Query OK, 3 ROWS affected (0.01 sec)
 
mysql> CALL listAdmins();
Empty SET (0.00 sec)
 
Query OK, 0 ROWS affected (0.00 sec)

 

3. 저장프로시저(insertAdminupdateAdminPassword)를 삭제합니다.

mysql> DROP PROCEDURE insertAdmin;
Query OK, 0 ROWS affected (0.00 sec)
 
mysql> DROP PROCEDURE updateAdminPassword;
Query OK, 0 ROWS affected (0.01 sec)

 

4. 저장프로시저(insertAdminupdateAdminPassword)에 SHA256을 적용하여 다시 생성합니다.

DELIMITER $$
CREATE PROCEDURE insertAdmin
  (i_userid VARCHAR(255),
   i_password VARCHAR(255),
   i_nick VARCHAR(255))
BEGIN
  INSERT INTO admins(userid, password, nick) VALUES(i_userid, SHA2(i_password, 256), i_nick);
END $$
DELIMITER ;
DELIMITER $$
CREATE PROCEDURE updateAdminPassword
    (i_sno INT,
     i_password VARCHAR(255))
BEGIN
    UPDATE admins SET password = SHA2(i_password, 256) WHERE sno = i_sno;
END $$
DELIMITER ;

 

5. 관리자 3명을 추가해봅니다.

mysql> CALL insertAdmin('userid1', 'passwd1', 'nick1');
Query OK, 1 row affected (0.00 sec)

mysql> CALL insertAdmin('userid2', 'passwd2', 'nick2');
Query OK, 1 row affected (0.01 sec)

mysql> CALL insertAdmin('userid3', 'passwd3', 'nick3');
Query OK, 1 row affected (0.00 sec)

 

6. 관리자 목록을 조회해보면… 비밀번호가 제대로 암호화되었다는 것을 확인할 수 있습니다.

mysql> CALL listAdmins();
+-----+---------+------------------------------------------------------------------+-------+
| sno | userid  | password                                                         | nick  |
+-----+---------+------------------------------------------------------------------+-------+
|  10 | userid1 | 3b1d7e9a7c37141350fb473fa099b8b18030cde1909f363e3758e52d4ea1a7b4 | nick1 |
|  11 | userid2 | 5a7d362627a891441ee34012b087915f03a6958c1062fe4cf01de24abecee053 | nick2 |
|  12 | userid3 | 44f1471b4598a6f5577221f7caf011743343b8b3b29c9675738cd225055563b7 | nick3 |
+-----+---------+------------------------------------------------------------------+-------+
3 rows in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> exit

 

1. 설치하면서 root 비밀번호를 물어보면 적당한 것으로 입력한다.

$ sudo apt-get install mysql-client-8.0 mysql-server-8.0 libmysqlclient-dev
$ sudo /etc/init.d/mysql start

 

2. 외부접속 허용 설정

$ sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
bind-address = 0.0.0.0

 

3. MySQL root 계정 비밀번호 변경 (mysql 을 설치하면 root 계정의 비밀번호가 설정되어 있지 않으므로 반드시 설정하여야 한다.)

$ mysqladmin -u root password 새로운비밀번호 -p

 

4. root 계정 외부에서 접속 설정 (필요한 경우에만 설정)

$ sudo mysql -u root
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root의 비밀번호';
FLUSH privileges;

 

5. Character set 을 UTF-8로 DB를 생성하고, 사용자 계정을 생성하는 방법은 다음과 같다.

DB Name   : xyz
User Name : xyz
Password  : xyz123
$ sudo mysql -u root
Welcome TO the MySQL monitor.  Commands END WITH ; OR \g.
Your MySQL connection id IS 13
Server version: 8.0.26-0ubuntu0.20.04.2 (Ubuntu)
 
Copyright (c) 2000, 2021, Oracle AND/OR its affiliates.
 
Oracle IS a registered trademark OF Oracle Corporation AND/OR its
affiliates. Other names may be trademarks OF their respective
owners.
 
TYPE 'help;' OR '\h' FOR help. TYPE '\c' TO clear the CURRENT INPUT statement.
 
mysql> CREATE DATABASE xyz DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
Query OK, 1 ROW affected, 2 warnings (0.06 sec)
 
mysql> CREATE USER 'xyz'@'%' IDENTIFIED BY 'xyz123';
Query OK, 0 ROWS affected (0.03 sec)
 
mysql> GRANT ALL PRIVILEGES ON xyz.* TO 'xyz'@'%' WITH GRANT OPTION;
Query OK, 0 ROWS affected (0.00 sec)
 
mysql> CREATE USER 'xyz'@'localhost' IDENTIFIED BY 'xyz123';
Query OK, 0 ROWS affected (0.01 sec)
 
mysql> GRANT ALL PRIVILEGES ON xyz.* TO 'xyz'@'localhost' WITH GRANT OPTION;
Query OK, 0 ROWS affected (0.01 sec)
 
mysql> FLUSH privileges;
Query OK, 0 ROWS affected (0.00 sec)
 
mysql> exit

 

6. 테이블 생성 및 기초 데이터 입력

$ mysql -u xyz -pxyz123 xyz
mysql: [Warning] USING a password ON the command line interface can be insecure.
Welcome TO the MySQL monitor.  Commands END WITH ; OR \g.
Your MySQL connection id IS 14
Server version: 8.0.26-0ubuntu0.20.04.2 (Ubuntu)
 
Copyright (c) 2000, 2021, Oracle AND/OR its affiliates.
 
Oracle IS a registered trademark OF Oracle Corporation AND/OR its
affiliates. Other names may be trademarks OF their respective
owners.
 
TYPE 'help;' OR '\h' FOR help. TYPE '\c' TO clear the CURRENT INPUT statement.
 
mysql> CREATE TABLE `users` (
    ->     `sno`      INT NOT NULL AUTO_INCREMENT,
    ->     `username` VARCHAR(80) NOT NULL,
    ->     `password` VARCHAR(60) NOT NULL,
    ->     `email` VARCHAR(254) NOT NULL,
    ->     PRIMARY KEY (`sno`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 ROWS affected, 1 warning (0.02 sec)
 
mysql>
mysql> CREATE TABLE `admins` (
    ->     `sno`      INT NOT NULL AUTO_INCREMENT,
    ->     `userid`   VARCHAR(255) NOT NULL,
    ->     `password` VARCHAR(255) NOT NULL,
    ->     `nick`     VARCHAR(255),
    ->     PRIMARY KEY (`sno`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 ROWS affected, 1 warning (0.02 sec)
 
mysql> SHOW TABLES;
+---------------+
| Tables_in_xyz |
+---------------+
| admins        |
| users         |
+---------------+
2 ROWS IN SET (0.00 sec)
 
mysql> INSERT INTO admins(userid, password, nick) VALUES('testid1', 'passwd1', 'nick1');
Query OK, 1 ROW affected (0.01 sec)
 
mysql> INSERT INTO admins(userid, password, nick) VALUES('testid2', 'passwd2', 'nick2');
Query OK, 1 ROW affected (0.00 sec)
 
mysql> INSERT INTO admins(userid, password, nick) VALUES('testid3', 'passwd3', 'nick3');
Query OK, 1 ROW affected (0.00 sec)
 
mysql> INSERT INTO admins(userid, password, nick) VALUES('testid4', 'passwd4', 'nick4');
Query OK, 1 ROW affected (0.00 sec)
 
mysql> INSERT INTO admins(userid, password, nick) VALUES('testid5', 'passwd5', 'nick5');
Query OK, 1 ROW affected (0.01 sec)
 
mysql> SELECT * FROM admins;
+-----+---------+----------+-------+
| sno | userid  | password | nick  |
+-----+---------+----------+-------+
|   1 | testid1 | passwd1  | nick1 |
|   2 | testid2 | passwd2  | nick2 |
|   3 | testid3 | passwd3  | nick3 |
|   4 | testid4 | passwd4  | nick4 |
|   5 | testid5 | passwd5  | nick5 |
+-----+---------+----------+-------+
5 ROWS IN SET (0.00 sec)
 
mysql> exit

Windows 에 Apache+MySQL+PHP 를 한번에 설치해주는 여러 프로그램이 있지만, 여기에서는 각각 직접 다운로드 받아서 설치하는 것을 보도록 하겠다. 그리 어렵지 않으며, 기본을 알고 이용하는 것이 더 이해에 더 도움이 되기 때문이다.

설치순서
  1. MySQL
  2. Apache
  3. PHP
MySQL
  1. http://www.mysql.com/downloads/mysql/에서 추천하는 현재 버전의 MySQL Community Server 를 다운로드 받는다.
  2. 다운로드 받은 파일은 대략 mysql-essential-5.1.50-win32.msi 과 비슷한 이름일 것이다.
  3. 이 파일을 실행하고, Typical 을 선택하여 설치를 진행한다.
  4. 설치 완료후, Configure the MySQL Server now 에 체크를 하고 종료하면, 설정을 진행할 것이다.
  5. Configuration Type 에서는 Detailed Configuration 을 선택한다.
  6. Server Type 에서는 Developer Machine 을 선택한다. (Windows 에서는 보통 개발용으로 설치하므로)
  7. Database Usage 에서는 Multifunctional Database 를 선택한다.
  8. The approximate number of concurrent connections to the server 에서는 Online Transaction Processing (OLTP)를 선택한다.
  9. Enable TCP/IP Networking 에 체크한다.
  10. Port Number 는 3306 으로 그대로 둔다.
  11. Enable Strict Mode 에 체크한다.
  12. Default Character Set 에서 Best Support for Multiingualism (UTF-8) 을 선택한다.
  13. Install As Windows Service 를 체크한다.
  14. Include Bin Directory in Windows PATH 를 체크한다.
  15. root 비밀번호를 자신이 원하는 것으로 설정한다.
  16. 설치가 완료되었으면, 커맨드창을 띄워서, mysql -u root -p 를 입력하고, 비밀번호를 입력하여 정상 로그인되면 끝난 것이다.
Apache
  1. http://httpd.apache.org/download.cgi 에서 최신버전의 Apache 를 다운로드 받는다.
  2. 다운로드 받은 파일은 아마도 httpd-2.2.16-win32-x86-openssl-0.9.8o.msi 이런 이름과 비슷할 것이다.
  3. Network domain : localhost, Server Name : localhost, Administrator's E-mail Address : test@localhost 로 입력한다.
  4. Setup Type 은 Typical 을 선택한다.
  5. 설치가 완료되었으면, 웹브라우저에서 http://localhost/ 를 입력해서 It works! 메시지가 나오면 정상 동작하는 것이다.
PHP
  1. http://windows.php.net/download/에서 최신버전의 PHP를 다운로드 받는다. 한가지 주의할 것은 VC6 x86 Thread Safe 를 다운로드 해야 한다는 것이다. 이 것 말고, VC9 로 컴파일 된 것이 있는데 이는 IIS연동을 위한 것이다. Apache 와 연동하기 위해서는 VC6으로 컴파일 한 것을 사용해야 한다.
  2. 다운로드 받은 파일은 대략 php-5.3.3-Win32-VC6-x86.msi 과 비슷한 이름일 것이다.
  3. Select the Web Server you wish to setup 에서 Apache 2.2.x Module 을 선택한다.
  4. Apache Configuration Directory 에서는 Apache가 설치된 디렉토리의 conf 디렉토리를 선택한다. 디폴트 디렉토리로 설치했다면, C:\Program Files\Apache Software Foundation\Apache2.2\conf\ 가 될 것이다.
  5. Choose Items to Install 에서는 아래 것들을 추가 선택한다.
    • Register *.php files to open automatically with PHP
    • Internationalization
    • Multi-Byte String
    • XSL
    • PEAR Install
    • PHP Manual
  6. 설치가 완료된 후에, C:\Program Files\Apache Software Foundation\Apache2.2\htdocs 에 phpinfo.php 를 만들어서 아래와 같이 내용을 입력한다.
    <?php
    phpinfo();
    ?>
    
  7. 마지막으로 웹브라우저에서 http://localhost/phpinfo.php 를 입력하여 PHP 설치정보가 나오면 완료된 것이다.

PHP 에도 다양한 프레임워크가 존재한다. 그중 유명한 것이 Zend Framework, CakePHP, CodeIgniter 등이다. 이 중에서도 성능이 가장 괜찮고 점점 인기를 더해가고 있는 CodeIgniter 설치방법을 정리해보았다.

아래의 설치방법은 Debian 5.0, 6.0 에서 모두 적용 가능하다.

기본 프로그램 설치
# apt-get install build-essential ssh vim htop ntp
Apache + mod_php 설치
# apt-get install libapache2-mod-php5 php5-mysql

함께 설치되는 패키지들 :
apache2-mpm-prefork php5-common php5-suhosin
→ Apache 가 함께 설치됨

MySQL 5.1 설치
# apt-get install mysql-client-5.1 mysql-server-5.1 libmysqlclient-dev
설치시 root 의 비밀번호를 물어보는데 자신이 원하는 적당한 것으로 지정한다.
사용자, DB 생성
# mysql -u root -p
mysql> CREATE DATABASE 디비이름 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
mysql> GRANT ALL PRIVILEGES ON 디비이름.* TO '아이디'@'localhost' IDENTIFIED BY '비밀번호' WITH GRANT OPTION;
mysql> FLUSH privileges;
프로젝트 생성
$ mkdir -p /opt/project/프로젝트명/web
$ cd /opt/project/프로젝트명/web
Apache 설정
# cd /etc/apache2/sites-available
# vi 프로젝트명
NameVirtualHost *:80

<VirtualHost *:80>
    ServerName 자신의도메인URL
    DocumentRoot /opt/project/프로젝트명/web
</VirtualHost>

# a2enmod rewrite
# a2ensite 프로젝트명
# /etc/init.d/apache restart
CodeIgniter 설치
  1. http://codeigniter.com/download.php 에서 CodeIgniter_1.7.2.zip 다운로드한다.
  2. 압축을 풀고 /opt/project/프로젝트명/web 에 업로드 한다.
  3. /opt/project/프로젝트명/web 에.htaccess를 작성한다.
    RewriteEngine on
    RewriteCond $1 !^(index\.php|images|robots\.txt)
    RewriteRule ^(.*)$ /index.php/$1 [L]
    
  4. system/application/config/config.php 파일을 열어 기반url(base URL)을 세팅한다.
    $config['base_url'] = "자신의도메인URL";
    
  5. 데이터베이스를 사용한다면 application/config/database.php 파일을 열어서 데이터베이스 정보를 세팅한다.
    $db['default']['hostname'] = "localhost";
    $db['default']['username'] = "아이디";
    $db['default']['password'] = "비밀번호";
    $db['default']['database'] = "디비이름";
    $db['default']['dbdriver'] = "mysql";
    
  6. 마지막으로 보안을 위해서 system 디렉토리를 sys로 변경하고, index.php 의 $system_folder 변수를 변경해준다.
    $system_folder = "sys";
    
    sys 대신 자신이 원하는 다른 것으로 변경하길 바란다.
  7. 웹브라우저에서 자신의도메인URL 로 접속해본다.

+ Recent posts