티스토리 뷰

보안측면에서 인증은 매우 중요하다.


웹에서 인증 할 수 있는 방법은 기본적으로 2가지이다.

 - 아파치 웹 서버의 인증 기능 사용

 - PHP를 통한 직접 인증 처리 ( 인증처리 프로그램 작성 )


둘 다 알고있어야 하지만, 보통 두번째를 더 많이 사용한다.






1. 아파치 웹 인증

 - 아파치 설정파일 에서 가능하다. 



#> vi /etc/httpd/conf/httpd.conf 로 들어가보면






# 317번 라인부터 <directory [경로]> [내용] </directory> 형식이 시작된다.

위 형식에서 [경로] 에 지정된 경로만 아래의 해당 설정이 적용된다.

즉, 해당 디렉토리의 파일에대해 인증을 요구하는 설정이 적용되는 것이다.



AuthType Basic


AuthName "Basic Authentication"


AuthUserFile /var/www/html/.htpasswd

 - 실제 인증을 요구할 떄 사용자의 정보가 들어있는 파일

 - .htpasswd는 내가 지정해주기 나름이다. 앞에 '.'을 붙혀서 숨김파일로 만들어준다.

 - 현재 상태에서는 .htpasswd파일이 존재하지 않기때문에 그누구도 인증을 통과 할 수 없다


Require valid-user

 - 어떤 사용자에게 인증을 요구할것인가? 인증을 통과한 사용자에게만 접근을 허가하겠다 라는 의미.



위의 네가지를 추가해줘서 인증을 설정해주면 된다. 설정이 완료된 이후에는 restart가 필요하다. (#> service httpd restart)


참고)_ 명령어

vi 내에서 행번호 표시되게 하려면 :set nu






# 설정이 잘 되었다면 기존에는 아무런 제약 없이 접속할 수 있었지만 인증을 요구하는것을 알 수 있다.

이 인증 사용자는 리눅스 계정하고는 상관이 없다. 우리가 위에 경로로 지정해둔 

.htpasswd파일에 따로 적어놓은 사용자만 인증이 가능하다.






#> htpasswd [option] [target] [username] ([password]) 와 같이 입력하여 해당 파일에 인증된 사용자를 등록시킬 수 있다.






#> htpasswd -c .htpasswd user1

위와같이 user1을 등록해보자. 기본적으로 처음으로 생성한다면 -c 를 반드시 붙혀줘야한다( -c : Create a new file).

패스워드 입력하라는 란이 뜨는데 보안상 입력하여도 표시되지않는다.






# 잘 등록된것을 확인할 수 있다.


그러면 추가된 사용자로는 인증이 가능할 것이다.

인증을 요구했던 창에 등록한 username과 password를 입력해보면 접근이 가능해진다.

인증을 통과한 사용자만이 사용 가능해진다.






웹에서의 인증이 특별하게 취급되는 이유

 - 사용하는 대부분의 프로그램들이 인터넷을 필요로 하기때문이다.

카카오톡, 웹서비스, 게임, 클라우드 등 인터넷 안쓰는 프로그램 이 거의 없다. 

이 대부분의 프로그램들이 TCP 라는 통신방식을 쓴다


PC에서 실행하는 프로그램을 '클라이언트' 라 하고, 그 통신 대상인 '서버' 가 있다.

하나의 서버에 여러 사용자가 접속 ( 사용자 (n) : 서버 (1) )하는 구조를 갖고있다.

즉, N:1 구조인데 여기서 session 이라는 연결상태 를 맺게된다.



# 클라이언트와 서버의 N : 1구조



이 과정에서 인증받은 사용자 인지 확인을 한다. 세션이 끊어지기 전까지는 인증은 유효하다. (신뢰할 수 있는 세션, 이미 인증을 통과한 세션)

인증을 통과하지 못하면 세션은 끊어진다.


하지만 자원은 한정적이기 때문에 서버도 최대로 연결받을 수 있는 한계가 있다.


예를들어 게임과 웹을 비교해보자. 

배틀그라운드의 동시접속자 수가 300만 이상이라고 한다 (17.12.29 기준 / http://www.inven.co.kr/webzine/news/?news=191802)

페이스북 유저는 20억이라고 한다(17.06.28 기준 / http://www.hani.co.kr/arti/economy/it/800569.html) 

동시접속자 수로 비교하더라도 페이스북이 월등히 앞설것이 분명하다.


최대치로 가정해 페이스북 서버는 최대 20억세션을 한번에 감당 할 수 있어야 한다는 의미인데, 불가능하다.

뿐만아니라 게임은 로그아웃 이라도 있지만, 웹은 로그아웃도 따로 없다.


따라서 웹은 세션을 유지하지 않는다. 항상 끊는다.

html페이지 요청 → 그에대한 응답 돌려주면 세션이 끊긴다.

다시말해, 계속 세션을 수시로 전달하는 개념이다. 비유하자면 전화를 수시로 계속 거는 것과 유사하다.


이렇게되면 인증이 문제가 된다. 


매번 인증을 계속 할 수 없기때문에 즉, 세션을 유지할 수 없기때문에 웹이 선택한 방식은 '인증토큰' 이다.

인증토큰 이라는 것을 두고, 인증에 통과한 사용자에게는 해당 인증토큰을 발행하여 재접속시 인증을 요구하지 않는 원리이다.



# 이것이 인증토큰 이다. 


아파치 인증을 사용하는 경우엔 헤더에 있는 Autorization 을 통해 인증을 진행한다.

서버가 Autorization 값을 제공하면 브라우저가 값을 가지고있다가 

세션이 끊어져도 다시 접속시에 브라우저가 값을 가지고있어서 계속 인증을 요구하지 않게끔 한다.


따라서 브라우저를 모두 종료하면 해당 값도 사라진다.


보안적 측면에서 이를 다시 바라보면

인증토큰은 같은 의미이지만 달리말하면 이 인증토큰값만 알고있으면 인증을 우회할 수 있다.

웹이니깐 가능한 공격방법 중 하나이다.






2. 인증 처리 프로그램 작성

 - 인증을 처리하려면 처리할 자료가 있어야 하기때문에 (ID, Password, ...) 데이터베이스를 필요로 한다.


참고)_ 

해상도 (800 x 600) : 픽셀 갯수 픽셀에 점을찎어 색을 표현하는것. 둘을 곱한 48만바이트 가 필요하다.

컴퓨터의 성능을 비교할 때, 시간복잡도를 논할 떄 기준으로 잡는 데이터의 수를 1억 = 1초 로 본다.


파일을 관리하는 프로그램을 데이터베이스 라고 한다. 다만 사용자의 요청에 의한 응답을 더 수월하게 하도록

내부적으로 검색, 정렬, 연계 등을 처리해 둔 것.


이런 관리 시스템을 DBMS (Data Base Management System) 이라 하고, DBMS 의 예로는 Oracle, MySQL 등이 있다.


이제는 DBMS만으로도 데이터를 처리할 수 없을만큼 누적된 데이터가 너무 많아졌다.

따라서 기존의 시스템만 가지고는 처리가 되지 않아 분산식 처리 시스템이 나오게 되었다.

분산식 처리 시스템의 예로는 NoSQL 등이 있다.


기존의 DBMS 는 관계형 (Relation) DB 이다.

대표적인것으로는 MySQL, Oracle, DB2, MSSQL 등


관계형DB는 정형화된 데이터를 다룰떄 효과적이다. 다시말해 저장할 데이터가 명확할 경우 효과적이다.



그러나 오늘날 단적인 예로 사람은 정형화 되어 처리할 수 없다고 판단하고,

그런 비정형화 된 데이터를 관리하는 시스템이 분산식 처리 시스템 (NoSQL..) 이다.

대표적으로 MongoDB, HaDoop 등이 있다.


한국에서는 빅데이터 = NoSQL 이라는 개념이 강하게 자리잡고 있다. 

빅데이터를 하려면 하둡을 해야한다는 둥..

하지만 빅데이터는 단순하게 일대일로 생각할 문제가 아니다.

데이터의 형태에 따라서 적절하게 사용 될 수 있어야 한다.


그 예로

트위터 : HaDoop 을 이용해서 빅데이터 시스템을 구축

페이스북, 아마존 : MySQL을 이용해서 빅데이터 시스템을 구축(관계형 DB)


따라서 빅데이터 != NoSQL 임을 페이스북과 아마존이 증명했다고 볼 수 있다.

이상적인 형태는 둘 다 적절하게 적재적소에 사용할 수 있어야 한다.






본론으로 돌아와, 관계형 DB중에서도 MySQL을 이용해보도록 하자.



데이터 베이스 (DataBase)


SQL ( Structured Query Language ) 

 - 구조화된 질의 언어

 - CREATE, DROP, SELECT, INSERT, UPDATE, DELETE

 - 이 6가지 쿼리는 기본중에 기본이고 가장 중요하다.



MySQL 참조사이트 : https://dev.mysql.com/



# 인터넷 검색보다는 공식문서를 참조하며 하는게 좋다. ( https://dev.mysql.com/doc/refman/5.5/en/sql-syntax.html )






환경부터 구축하도록 하자.



[설치]


1. 데몬(서버 프로그램) : mysql-server

2. 클라이언트 프로그램 : mysql


둘다 설치를 해줘야 MySQL에 접속을하여 쿼리실습이 가능하다.






# 이렇게 두개가 설치되어야 한다.

#> yum install mysql-server.i686






#> yum list installed mysql* 입력시

mysql.i686

mysql-libs.i686

mysql-server.i686

이렇게 세개가 나와야 한다.


따로 mysql.i686은 설치 명령을 입력하지 않았지만 yum 명령어가 알아서 설치 한 듯 하다.



실행은 클라이언트 프로그램에 들어가서 접속하는형태이다.

온라인 접속이 기본적으로 mysql-server에 가능하긴한데, 우리는 서버를 실행하는 리눅스와 접속하는 리눅스가 같다.

따라서 서버가 항상 실행중일때 클라이언트 프로그램을 통해서 서버에 접속하는것이다.


우선 서버를 먼저 실행시키자.



#> service mysqld start


이때, 잘 작동되고 있는지 확인하려면 #> netstat -ant를 입력한다.



# 3306 (MySQLd이 사용하는 포트번호) 과 80(HTTPd가 사용하는 root 포트번호)이 보이면 된다. (d : demon 의 약자)

이렇게 서버가 실행중인 상태에서 서버에 접속하자.



#> mysql -h [ip or host domain]

#> mysql -h localhost -u root 입력시 프롬프트 쉘이 mysql> 로 변경된 것을 볼 수 있다.

프롬프트 쉘을 보고 mysql에 접속여부를 확인 할 수 있다.


접속되면 리눅스명령어는 더이상 먹지 않는다.

종료시 mysql> quit


원격지서버에 접속하는것이아니면 host옵션은 없어도 된다. (그냥 localhost 에 접속하는거라면)

즉, #> mysql -u root 로 입력해도 된다는것이다.






패스워드 설정부터 해보도록하자.

패스워드 설정 방법은 쿼리를 아직 배우지 않았기때문에 명령어를 통해 해보도록 하자.



# [패스워드 설정]

#> mysqladmin -u root password [사용할패스워드]        //-u root : 사용할 사용자(user)가 root라는 의미

패스워드를 입력해주면 접속할때 Acces denied 라고 뜬다. 따라서 접속을 하려면 패스워드를 써야한다.



# -p 옵션을 같이 적어 패스워드를 입력하자. 보안상 패스워드 입력시 글자가 보이지 않음.






SQL 의 종류 (크게 세가지)


1. DDL

 - Data Definition Language)

 - 데이터를 정의할 수 있는 구문

 - 생성 및 삭제 : CREATE, DROP

 - 관계형DB를 쓴다? 정형화된, 구체화된 DB를 쓴다는 것.

 - 그런 정형화, 구체화를 어떻게 시킬지 정하는 구문


2. DML

 - Data Manipulation Language

 - 데이터를 조작할 수 있는 구문

 - 생성된 데이터를 실질적으로 찾거나 수정하거나, 조회 등등

 - 조회(검색), 입력, 수정, 삭제 등을 할 수 있는 쿼리

 - SELECT, INSERT, UPDATE, DELETE //이 네가지 못하면 아무것도 못한다.


3. DCL

 - Data Control Language

 - 데이터를 제어할 수 있는 구문

 - 권한, 트랜잭션,Locking, ...






# DB목록을 조회할수있는 쿼리 : show 

테이블, 데이터베이스 목록등을 확인할 떄 사용한다.

mysql> show databases; 와 같이 mysql 에서는 항상 세미콜론으로 문장을 마무리 지어줘야한다.


information_schema

 - 나중에 공격할때 매우 유용하게 사용되는 DB


mysql

 - 사용자권한, root에 대한정보 등이 포함된것. 제거하면 리눅스자체를 다시 설치해야한다.


test

 - 말그대로 test용 DB이다. 지워도 무관하다.






# DB 삭제 쿼리 : drop

mysql> drop database test; 로 해당 DB를 삭제할 수 있다.


우리가 접속된 계정은 root 이기때문에 지우지 못하는 DB는 없다. 

따라서 drop, update, delete 같은 쿼리는 매우 조심해야한다.






인증을 위한 사용자 정보를 담는 DB를 따로 만들어 보자.


DB를 생성할 땐 create 쿼리를 이용.



# DB 생성 쿼리 : create

mysql> create database [디비이름];






# DB 선택 쿼리 : use

특정 동작을 수행하는 쿼리, 예를들어 insert 쿼리를 사용할 때는 어떤DB에 대한 수행을 할것인지? 를 먼저 설정해줘야한다.

따라서 반드시 내가 사용할 DB를 먼저 선택해줘야한다. 그 명령이 use 이다.






#이렇게 use로 해당 DB를 선택을 해 둔다음에 어떠한 이후 명령을 실행 할 수 있는것이다.

중요한것은 현재 어떤 DB를 선택했는지 프롬프트에 나타나지 않으므로 기억을 해 둬야한다.


DB안에는 여러가지 테이블들이 올 수 있는데, 처음에는 아무것도 없다.

마찬가지로 table을 보려면 show tables 입력해서 확인해 볼 수 있다.



테이블에서 인지해야 할 사항은

컬럼(col)의 개수가 내가 저장하고자하는 데이터의 갯수가 된다.

한 행(row) 은 한 데이터의 전체정보를 나타낸다.


테이블을 이란 내가 저장할 데이터의 형태를 표형태로 저장하는 개념이다. 

따라서 Table 이라고 부른다.






DB의 이론적인 측면은 너무 깊다.

예를들어 어떤 한 사람에 대한 정보로 가족, 취미, 질병 등 모든 정보를 한꺼번에 저장할라면 너무 방대해진다

근데 가족과 질병 간에는 관계를 지을 수 있다. 따라서 그것을 쪼개서 다른 테이블로 관계만 연결시켜준다.

이런것들이 DB이론적인 측면이다. 속도적인 측면과도 직결된다. 

'WEB > WEB HACKING' 카테고리의 다른 글

1-11) PHP를 통한 DB제어  (0) 2018.02.24
1-10) MySQL기초 / PHP에 DB연동  (0) 2018.02.23
1-8) GET vs POST  (0) 2018.02.21
1-7) PHP 환경구축 / 기본 표현식  (0) 2018.02.20
1-6) JavaScript DOM, BOM  (0) 2018.02.15
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함