웹 서버에서
사용자들을 어떻게 인증할까?
* 웹에서의 인증 특징
- TCP통신을 한다. 일반적인 인증과 동일하게 진행할 수도 있다.
- 웹의 특성상 세션을 유지하지 않는다.
- 웹 서버 어플리케이션은 사용자 인증을 위한 인증 토큰을 발행한다.
인증 토큰에는 두가지가 있다.
1. 쿠키 (Cookie)
-> 보안에 취약하다.
-> 사용자 정보가 로컬 컴퓨터에 남는다.
2. 세션 (Session)
-> 쿠키의 보안 취약점을 개선하기 위해 나온 것이 세션이다.
그렇다면 이러한 인증 과정을 직접 확인해보겠다.
먼저 간단한 웹 인증페이지를 만들어 볼것이다.
auth 폴더를 따로 만들어서 여기서 작업을 하겠다.
(auth 폴더 생성)
vi 편집기를 이용해 login.php 파일을 작성한다.
#> vi login.php
(login.php)
간단하게 아이디와 비밀번호를 입력 받아
login_ok.php 파일에 전송해주는 페이지이다.
(페이지 모습)
그렇다면 이제 login_ok.php 파일을 만들어서
인증 과정을 만들어볼 것이다.
아직 DB를 손데지 않고 간단히 연관배열을 사용하여 인증을 해보겠다.
연관 배열 사용 테스트이다.
user1 ~ 3을 만들고 해당 비밀번호를 연관 배열로 설정한다.
그리고 입력받은 아이디의 비밀번호를 화면에 출력해보겠다. (테스트)
(login_ok.php)
이제 잘 동작하는지 체크해보겠다.
실행
(아이디 user1 입력)
(실행화면)
실행 화면에 user1의 비밀번호가 잘 출력된 것을 확인 할 수 있다.
이제 이 것을 사용하여 인증을 해보겠다.
php 언어에서 array_key_exists 함수를 사용해 해당 아이디에 관해 연관배열의 값이 있는지 체크하고
있다면 비밀번호가 입력받은 것과 일치하는지 체크해서 인증을 하겠다.
(login_ok.php)
결과 인증에 성공하면
로그인 성공이라고 팝업창을 띄우고
실패하면 실패라고 팝업창을 띄우는 script를 추가했다.
실행해서 확인해보겠다.
(접속)
(로그인 성공)
(로그인 실패)
비밀번호를 올바르게 입력했을 때 success가 뜨고
실패했을 때는 fail이라고 잘 떴다.
로그인 인증까지 확인했으니
이제 토큰 방법 중 하나로 쿠키를 사용해보겠다.
인증에 성공했을 경우에
쿠키를 추가해주는 코드를 추가해줄 것이다.
쿠키 설정 php 언어
setcookie("쿠키이름", "쿠키에 넣을 값", 유효기간, 쿠키값이 적용될 영역)
하나는 user_id의 쿠키 변수에 id를 그대로 사용했고
session_id 쿠키 변수에는 ID와 비밀번호를 연결해 해쉬함수로 바꾸어서 사용했다.
(쿠키 생성)
login.php 페이지에서
쿠키 값을 출력해보겠다. (쿠키값이 잘 설정되는지 확인하기 위하여)
(쿠키값 확인 코드)
실행
(실행 화면)
실행 화면을 보니 위에 우리가 설정해준 쿠키값이 잘 저장되 있는 것을 확인 할 수 있다.
또
F12 키를 눌러 관리자 모드에서 네트워크 부분으로 어떤 통신을 주고 받는지 확인 할 수 있는데
여기서 응답으로 쿠키 값을 보내준 것을 확인 할 수 있다.
(쿠키값 전달(응답))
혹은
관리자 모드에서 Console창에서도 확인 할 수 있다.
document.cookie
를 입력하면 나온다.
(저장된 쿠키값)
이제 이 쿠키값으로 인증을 해보겠다.
사실 이 쿠키값을 비교하여 일치하면 인증을 해주는 방식인데
우리는 여기서 간단하게 해보겠다.! ㅎㅎ
간단하게
쿠키값이 저장되어있다면!
로그인 을 해주도록 할 것이다.
(인증 코드 추가)
그렇게 하여 인증이 되면 해당 ID를 불러와 Welcome 페이지를 보여주고
인증이 안되었으면 로그인하는 페이지가 보이도록 하였다.
인증에 성공하면 아래와 같이 나온다.
(인증 성공)
(Console에서 확인)
콘솔에서도 확인 할 수 있다.
이렇게 편하고 좋은 쿠키가 보안에는 취약할 수 있다.
쿠키가 로컬 컴퓨터에 그대로 저장되기 때문에
만약 쿠키값으로 ID 혹은 패스워드를 그대로 사용하면
굉장히 위험하게 된다.
윈도우 IE에서 쿠키 값을 저장하는 곳을 확인해보겠다.
인터넷 옵션에 들어간다. 그 후 설정을 눌러준다.
(설정 클릭)
여기서 아래의 표시된 부분이
쿠키값이 저장되는 부분이다.
(쿠키 위치)
파일 보기를 누르면 해당 폴더가 열린다.
(쿠키 파일)
여기에는 쿠키파일 뿐 아니라 인터넷 임시 파일들도 저장되어 있다.
한번 로그인하여 우리의 소중한 쿠키가 어떻게 저장되는지 확인해 볼 것 이다.
(로그인)
(성공)
해당 폴더에 들어가서 확인해보니 우리가 방금 얻어온 쿠키값이 그대로 저장되 있는 것을
확인할 수 있다.
(쿠키값 파일)
이제 로그아웃 링크를 하나 만들어주어 쿠키값을 없애보도록 할 것이다.
만약 이 기능이 없다면
로그인이 한번 되면 적어도 하루 동안은 그 페이지 로그인 페이지를 볼 수 없다...
로그아웃 기능 추가!
(링크추가)
로그아웃에 하이퍼링크로 logout.php 페이지를 입력해놓았다.
우리는 logout.php 페이지에서 logout을 해줄 것이다.
(logout.php 파일 생성)
쿠키를 지우는 방법은 아까 setcookie 함수를 사용했던 것과 같다.
다만 쿠키값을 "" 빈 채로 설정하는 것이다.
(logout.php 코드)
다시 화면에 가보면 logout 링크가 되있는 것을 볼 수 있다.
(logout 추가)
버튼을 누르면
다시 login.php 페이지에서 로그인 화면을 볼 수 있다.
(로그인 페이지)
두 번째 토큰 방법으로 session이 있다.
이 session은 브라우저가 열려있을 때만 유효하고
닫히게 되면 session이 사라지는 특징이 있다.
또
중요한 특징은
서버에 저장된다는 것이다. (그렇기에 쿠키에 비해 안전하다고 할 수 있다.)
login_ok.php 파일에서
아까 만든 쿠키 설정은 주석으로 처리해 두고
세션 값을 설정해주겠다.
방법은
session_start();
를 입력하는 것이다.
(세션 추가 코드)
페이지에 접속하자마자 세션ID 쿠키를 만들어 준다.
바로 이게 session_start() 가 하는 일이다.
이 값을 확인해 보겠다.
(세션ID값 확인)
(콘솔에서 확인)
물론 콘솔에서도 확인 할 수 있다.
이 값은 아까 서버에 저장된다고 했었는데
그 위치는
/var/lib/php/session/ 에 파일로 존재하게 된다.
그렇기에 아까 확인했던 값이 파일 이름형태로
저장되있는 것을 확인 할 수 있다.
(세션 ID 위치)
세션ID가 설정되어있는 것 까지 확인했다.
이제 다음에
이 세션ID에 인증내용을 추가하는 기능을 만들어 확인하겠다.
'Hacking > Web Hacking' 카테고리의 다른 글
WebHacking - PHP File Upload 취약점, 웹 서버 글로벌 설정 파일 (2) | 2017.02.20 |
---|---|
WebHacking - session(인증) (0) | 2017.02.20 |
WebHacking - CSRF Attack (0) | 2017.02.16 |
WebHacking - XSS Attack (1) | 2017.02.15 |
WebHacking - GET, POST 메소드 전송 (0) | 2017.02.15 |