지난 포스팅 글에서
아파치 웹 서버의 설정파일을 통해서 인증을 구현해보았다.
이어서 인증 사용자를 추가하고 추가적으로
글로벌 설정 파일과 로컬 설정 파일, 웹 서버 설정 파일에 대해 간략히 이야기 해보겠다.

지난 글에서 설정한 내용에서 우리가
.htpasswd 파일에 정보를 이용해 인증에 사용할거라는 코드가 있었다.
이제 그 파일을 만들어주는 작업을 해주면 된다.

처음 파일을 만드는 경우와 기존에 있던 파일에 사용자를 추가하는데 있어서
코드가 조금 다르다.


처음에 파일을 만드는 경우
#> htpasswd -c /var/www/html/.htpasswd user1




(사용자 생성)



user1을 생성해 보았다.

이제 기존에 있던 파일에 사용자를 추가하는 작업을 해보겠다.

이미 만들어진 파일에 사용자를 추가하는 경우
#> htpasswd /var/www/html/.htpasswd user2
여기서 user2는 사용자 이름이다.



(사용자 추가)



사용자를 추가해보았다.

.htpasswd 파일에 추가해주었는데 이 파일을 확인해 보면



(.htpasswd 파일)



확인해보면 사용자 아이디와 비밀번호가 보인다.
(비밀번호는 보안상 해쉬값으로 저장되어있는 것을 확인 할 수 있다.)

이렇게 만든 파일이 인증에 정말 잘 적용되는지
접속해보겠다.



(인증 접속)




(성공)



인증에 성공되어
페이지에 접근할 수 있는 것을 확인 할 수 있다.

관리자 도구에서 확인해보면
Authorization 항목에 값이 추가되있는 것을 확인 할 수 있다.



(인증 코드)



이렇게 글로벌 설정 파일을 이용하여 웹 페이지 인증을 설정해보았다.
그렇다면
부분적으로 인증을 요구하고 싶다면 어떻게 할까?

예를 들어 전에 우리가 만들었던 auth 폴더에만 인증을 요구하도록..

그러기 위해서는 로컬 설정 파일을 이용하면 된다.
확인해보기 위해 우리가 설정했던 코드들을 원래대로 지워준다.
단, AllowOverride All 은 그대로 둔다.
오버라이드를 허용하겠느냐라는 말인데 허용을 해야
우리가 추가적으로 설정을 할 수 있다.


(수정)



그 후 웹서버를 재시작 시켜준다. :)



(웹 서버 재시작)



글로벌 설정 파일 중
/etc/httpd/conf/httpd.conf
파일의 404번 라인을 보면
.htaccess 파일을 추가적인 설정 파일로 적용 시킬 수 있다는 부분이 보인다.

->
.htaccess 파일이 있는 디렉터리부터 그 하위까지 영향이 있다.
이 파일이 존재하면 그 해당 디렉터리 아래부터 인증을 요구하게 된다.

이 기능을 이용하여 웹 인증을 부분적으로 적용시켜보겠다.
auth폴더에 들어가서 .htaccess 파일을 만들어준다.



(auth 폴더)




(.htaccess)


.htaccess 파일에는 우리가 저번에 사용하였던
코드를 그대로 넣어준다. (인증을 사용하겠다는 말이다.)
그렇게 하여 확인해보면
auth 폴더에 있는 login.php 페이지에 대해 인증을 요구하게 된다.



(인증 요구)



반면 다른 폴더에 있는 제로보드 게시판에 대하여는
인증을 요구하지 않는 모습을 확인 할 수 있다.




(인증 요구없음)



이로써 글로벌 설정과 로컬 설정을 인증 설정을 하면서
확인해 보았다.

다음 글에서는 파일 업로드 취약점을 공략하기 위해
php 파일을 업로드 해야하는데
이 기능이 막혀있었던 것을 우회하는 방법을 살펴볼 것이다.





저번에 이어서 세션 이야기를 마무리해보겠다.

세션을 사용하려면 페이지 시작할 때 session_start()를 넣어준다.

세션을 이용해 간단한 인증을 해볼것이다.
세션인증을 위한 세션값을 만들어야하는데
islogin 값으로 아이디와 비밀번호를 연결해 해쉬값으로 저장하고
name 값으로 아이디를 저장했다.



(세션인증값 설정)



로그인 해보겠다.



(로그인)





(세션 확인)



로그인 후 세션쿠키값을 확인 할 수 있다.
하지만
세션값으로 우리는 알아낼 수 없다.
세션 쿠키값에 저장된 값들은 서버에 있기 때문이다!

그렇다면 서버에 가서 세션에 우리가 설정해 놓은 값이 잘 저장되었는지 확인해 보겠다.



(세션값 확인)



우리가 설정한 대로 해쉬값과 아이디 값이 보인다.

그러면 전에 쿠키값을 이용한 간단한 인증을 한 것 처럼
세션도 똑같이 해보겠다.
DB를 지금은 다루지 않을 것이므로
간단하게 세션값이 있으면 인증을 성공시켜 줄 것이다.



(인증 코드)




(인증 성공)




그렇다면
세션값을 어떻게 파기 시킬까?
세션 값은 세션이 종료되면, 즉 웹브라우저가 닫히면 세션값이 파기된다.

그렇지 않고
웹 브라우저가 켜진 상태에서 세션값을 파기하려면??
session_dstroy() 함수가 php에 있다. (사용해보겠다.)



(session_destroy() 사용)




사용 후 확인해보니..



(세션 파일 존재)




세션 파일이 존재한다.
그 세션파일에 들어가보니 내용은 전부 사라져있다.

즉 파기할 때 session_destroy()만 사용하면 세션 파일은 사라지지 않고
그 세션 파일에 저장된 값들이 지워지는 것이다.

그렇다면 세션 파일까지 지워주려면?
쿠키값을 제거할 때랑 똑같다.



(세션파일 삭제)




즉 세션을 파기하려면
세션 내용도 지워줘야하지만 세션 쿠키도 지워주어야 한다.




웹 서버에서
사용자들을 어떻게 인증할까?

* 웹에서의 인증 특징
 - 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에 인증내용을 추가하는 기능을 만들어 확인하겠다.



+ Recent posts