정보보안공부

웹보안_9. 웹페이지 인증 본문

정보보안/웹보안

웹보안_9. 웹페이지 인증

Steady_sp 2018. 2. 22. 00:10

인증

웹에서 인증하는 방법은 2가지에 대해서 알아보자.

 

1. 아파치

- 아파치에서 인증기능을 제공한다.

- 아파치 설정파일을 들어가서 내용을 일부 추가해보자.

 

 

 

<Directory "/var/www/html"> ... </Directory> 안에 내용을 작성한다.

AuthUserFile : 이파일에 인증을 통과할 사용자를 넣어놓는다.

Require : 인증을 통과한 사용자만 해당 디렉터리에 접근을 할 수 있드록 인증을 요구

 

설정을 저장하고 나와서 /var/www/html 위치로 이동한다.

 

 

htpasswd -c .passwd_file user1 : 인증할때 사용자이름을 user1으로 하겠다.

service httpd restart 를 이용해 아파치 설정을 재시작한다.

 

이제 웹페이지에서 /var/www/html/안에있는 모든 파일에 연결할때 인증창이 뜨게된다. /var/www/html은 해당 아파치 설정파일에 기본값으로 적혀있던 위치이다.

 

 

사용자이름과 비밀번호가 일치하면 해당 파일에 접속이된다. 이때 개발자환경으로 살펴보면 Authorization : Basic~ 이라는 것을 확인할수 있다. 이 인증창은 한번인증을 하게되면 웹페이지를 닫지 않는이상 다시는 물어보지않는다. 그 이유는 처음 인증한후 아파치에서 사용자에게 Authorization에 있는 토큰을 전달한다. 서버와 통신할때 마다 저토큰으로 인증을 대체한다.

 

2. PHP

- 인증을 하기 위한 사용자 DB를 생성한다.

- 인증을 처리하는 방법은 2가지가있다.

- 입력 -> 인증 -> 인가

 

 

DB에 5개의 값을 미리 입력해놓는다.

 

1. cookie

- 보안상 취약하다 : 사용자의 정보가 로컬 컴퓨터에 파일형태로 저장

- 서버에 정보가 남지 않고 클라리언트에 파일 형태로 정보가 남는다.

 

 

 

1) login.php

- 로그인을 하면 해당 로그인 id,pw와 DB에 저장되어있는 id,pw를 비교한다. id,pw가 일치하면 쿠키를 생성한다. 쿠키값을 이용해 로그인페이지는 로그인 상태를 유지할수 있도록 한다.

 

 

 

login.php는 if문 조건에 의해 Cookie값이 없으면 form태그를 실행하고 Cookie값이 있다면 로그인에 성공했다는 뜻이므로 로그인 상태를 유지한다.

 

 

로그인을 하고 다시 login.php파일을 열어보면 쿠키값이 보이는것을 확인할 수 있다.

auth.php에서 작성한 setcookie("name",$id,time()+84600,"/")에 의해서 name변수는 쿠키의 이름을 나타내고 $id는 쿠키의 값을 나타낸다. 따라서 name=user1이라는 값이되고 setcookie("auth",md5($id.$pw),time()+84600,"/")에 의해서 auth변수는 쿠키의 이름 md5($id.$pw)는 쿠키의 값을 나타낸다. md5는 해시함수이므로 id와 pw 문자열을 더한값의 해시값이다.

 

2) auth.php

- form태그에 의해 로그인된 정보를 $_REQUEST를 이용해 전달받은 데이터를 확인하고 DB의 정보와 전달받은 데이터를 비교해서 일치한지 확인한다. 일치한다면 setcookie에 의해 쿠키를 생성한다. time()+86400은 다음날까지 쿠키의 유효기간을 설정한다. "/"는 전체경로를 나타낸다.

 

 

 

Response Headers : 응답 헤더를 보면 Set-Cookie 값이 보이고 Request Headers 에도 쿠키값이 설정되어있다. 설정한 쿠키값을 이용해 인증을 한다.

 

3) logout.php

- 쿠키 초기화

 

 

-> echo "<a href='logout.php'>LogOut</a>" 에 의해 logout.php가 실행되면 쿠키값을 초기화 시킨다. 값을 "" 으로 바꾸고 time()-999999에 의해 변경한 시간보다 전으로 이동하면 초기화가 된다.

 

2. session

- 세션을 사용하기 위해서는 session_start()함수를 먼저 호출한다.

- 클라이언트(웹브라우저)는 session_id를 가지고 있는다. (/var/lib/php/session/위치)

 

1) login.php

- 로그인을 하기위한 form 태그를 이용해 데이터를 전달하고 나중에 auth.php에서 <meta태그>에 의해 login.php 페이지로 이동하면 SESSION값을 비교해 로그인상태를 유지시킨다.

 

 

session_start()를 실행하면 cookie를 통해 발행되는 session_id가 php에서 자동으로 만들어진다. 세션에 관한 것을 사용하기전에 session_start()를 먼저 해줘야 if문 안에있는 $_SESSION도 동작한다. session_start()를 했기 때문에 아무것도 입력하지 않은 상태에서 쿠키를 통해 session_id가 자동으로 만들어졌다 아래의 사진으로 확인해보자.

 

 

cd /var/lib/php/session/ 위치에 자동으로 session_id파일이 만들어진다.

 

 

입력한 id와 pw가 DB와 일치하지 않으면 auth.php파일 조건에의해 alert창이 뜨고 입력한 id와 pw가 DB와 일치하면 auth.php의 맨밑줄<meta 태그>에 의해서 login.php의 else문이 실행된다.

 

 

2) db.php

- db연결 코드

 

 

데이터 베이스와 연결시켜주는 코드를 다른 php파일에서 include "db.php" 또는 require "db.php"를 이용해 해당 db.php파일을 불러올 수 있다.

 

3) auth.php

- form태그에 의해 로그인된 정보를 $_POST를 이용해 전달받은 데이터를 확인하고 DB의 정보와 전달받은 데이터를 비교해서 일치한지 확인한다. 일치한다면 $_SESSION[변수] = 값의 형태를 이용해 세션변수와 해당값을 작성한다.

 

 

 

<meta 태그>를 사용하면 해당 url위치로 새로고침한다.

id와 pw가 DB와 일치하면 $_SESSION[name] = $id $_SESSION[is_login] = 1 에 의해 name변수는 id값 is_login값은 1을 갖게된다.

 

cd /var/lib/php/session에 들어가서

 

 

 

auth.php에서 입력한 SESSION값이 들어가있는것을 확인할 수 있다. 이 세션값을 통해 한번로그인을 한상태에서 이값들로 인증을 한다.

 

4) logout.php

- 세션초기화

- 쿠키삭제

 

 

session을 삭제할 때도 session_start()는 꼭 작성해야한다. session_destroy()는 해당 세션값을 삭제하고, setcookie로 쿠키값을 삭제한다.

 

cd /var/lib/php/session 에서

 

ls해도 아무런 값도 보이지 않는다.

 

 

 

'정보보안 > 웹보안' 카테고리의 다른 글

웹보안_11. MYSQL과 PHP연동하기  (0) 2018.02.24
웹보안_10. MYSQL/쿼리  (0) 2018.02.24
웹보안_8. GET/POST방식  (0) 2018.02.21
웹보안_7. php  (0) 2018.02.20
웹보안_6. HTML DOM/BOM  (0) 2018.02.17
Comments