티스토리 뷰

인증 처리


1. 아파치 웹서버 인증 ( 참고 : http://kevinthegrey.tistory.com/20?category=778262 )

아파치에서 인증을 하기위해 사용정보가 있는 파일을 만들어 인증을 처리

 - htpasswd 명령어를 통해서 .htpasswd file을 만들어서 진행하였다.


2. 웹 어플리케이션을 이용한 인증처리

 - 인증을 하기위한 사용자 DB생성, 직접 인증처리 알고리즘을 작성하여야 한다.


DB를 이용해서 실제 인증을 처리해보자.






입력 → 인증(authentication) → 인가(authorization)


인증 : 이 사용자가 올바른사용자인가 아닌가를 판단

인가 : 인증 이후의 과정. 인증을 받은 사용자에게 그에 해당하는 권한 부여



# mysql> SELECT * FROM 인증테이블 WHERE id='$id' and pw='$pw'; 

위와 같은 방식으로 입력된 값과 조회된 값의 일치 여부에따라 인증을 진행해보도록 하자.

조회된 결과가 없다는얘기는 인증에 실패했다는 얘기이다.


이와같이 이 SELECT 쿼리 하나만으로 입력된 값과 조회된 값이 일치하는가 에 해당하는 쿼리를 작성할 수 있다.






실습

 - 사용자로부터 아이디와 패스워드를 입력받아서 입력된 값이 DB에 존재한다면 'login success' 알람을 출력

그렇지 않으면 'login failed' 알람을 출력하는 프로그램 작성






# login.php 파일






# db.php 파일






# auth.php 파일 및 실행 결과






처음에 이해가 잘 되지않아 URL상에 주소/auth.php 로 접근을 시도하였다.

폼도 작동하지 않을 뿐더러, 원하는 결과를 출력하지 않았다.

당연하게도 login.php 라는 폼이 작성된 파일로 접근을 시도하여

해당 파일내의 폼에 값을 입력하고 submit을 하게되면 form의 상단에 action = auth.php 라고 지정해줬기때문에

폼에 기재한 id, pw값을 들고 auth.php 가 작동하게된다.

이 값을 받아와서 순차적으로 코드들을 실행하는 흐름이었다.


따로 login.php 파일을 만들어준 이유는, 왜냐하면 인증에 관련된 부분을 처리할 때

인증에 통과 했는지 안했는지 여부에따라 경우의수가 너무 많이 나뉘기때문이다.

또한 인증 성공 이후 폼에 남아있는 정보를 안보이게끔 처리해야하는 등 

다양해질 수 있는 경우의수를 차단하고, 또 대처하기위해 인증페이지와 로그인페이지를 나눠서 만든다.


auth.php에서 특이한점은 include "db.php"; 이다.

데이터베이스에 접근할때 항상 쓰이는 코드 (mysql_connect함수, mysql_select_db함수) 만을 따로

db.php 로 저장해둔 다음, 말그대로 include 하여 재사용 하기위함이다.

include는 호출된 자리에 원본파일의 코드가 그대로 들어간다고 생각하면 된다.


또, 주의해야할 점은 md5() 함수이다. 해시를 통해 비밀번호를 저장하였으므로, 

SELECT 로 패스워드를 조회할때도 당연하게 사용해줘야 한다.






인증 유지

로그인을 하여 인증을 통과하면, 다시 로그인 페이지에 갔을때 (뒤로가기) 

인증을 다시 요구하지 않게끔(로그인이 유지되도록) 처리해보도록 하자.


이를 처리하는 방법으로는 

1. 쿠키(cookie) 를 이용한 방법

2. 세션(session)을 이용한 방법

이 있다.


인증을 통과했을때 , 이 다음번에도 다시 인증을 요구하지 않도록 확인을 해야한다.

인증을 통과했으면 사용자만의 인증토큰 을 직접 만들어서 클라이언트한테 보내주고,

해당 토큰을 브라우저에서 보관하다가 다시 재접속했을시 그 토큰을 자동으로 전송해줘서 

로그인을 유지하도록 만들어보자.






PHP에서 쿠키를 발행하는 방법 : setcookie(); 함수를 이용

# setcookie($name, $value, $expire, $path);

 - name : 쿠키 이름

 - value : 실제 쿠키의 값

 - expire : 만기일. 언제까지 해당 쿠키를 유효하게 할것인지(초단위)

ex) 한시간 : 60 * 60 = 3600 따라서 time() +3600 과 같이 표현

  하루 : 60 * 60 * 24 = 86400 따라서 time() + 86400

 - path : 쿠키를 저장할 웹상의 경로

이정도까지만 설정해주면 충분하다.


#)_ 참고

setcookie 를 쓰기 전에 echo가 먼저 나와서는 안된다


서버로부터 받아온 cookie값은 브라우저에서 document 객체가 관리한다.

기본적으로 쿠키는 사용자별로 각기 다른값을 부여하여 각각 식별하는 값이기때문에

해시된 값을 사용하기도 하고, 쿠키로 여러 정보를 저장하기도 한다.

쿠키를 이용해서 사용자의 정보를 일시적으로 저장하기도 한다.

쿠키는 전역변수 용도로 사용할 때도 있고, 이용하기 나름이다. 

 

setcookie를 하여 전달된 내용을 확인하려면 헤더를 통해 값을 확인할 수 있다..






# login.php

auth.php 에서 setcookie()로 id, auth 값을 보내주는데, 그 값을 로그인화면에서 확인할수있게끔 하였다.

logout.php로 넘어갈수있는 링크를 걸어두었다.






# logout.php

이미 설정된 쿠키를 제거하려면 만료를 앞당기는방식으로 삭제가 가능하다.

setcookie()에서 이름을 이용해 value를 빈값으로 초기화 시켜주고, 유효시간을 이전시간보다 뒤로 돌리면 된다.

<meta http-equiv='refresh' content='0;url=login.php'> 는 로그아웃 이후 돌아갈 창을 설정해 준 것이다.

로그아웃이 되며, 다시 login.php 로 돌아가게끔 설정하였다.






# auth.php

setcookie()함수로 쿠키를 설정해줬다.

auth는 id와 pw를 합쳐 해시된 값으로 데이터를 설정하였다.






# 접근을 하면 쿠키에 대한 정보를 확인할 수 있다.

도큐먼트 객체 안에 쿠키라는 값이 생성되고 이를 통해 관리된다.

따라서 다음번 접속시 인증없이 재 접속이 가능하다.

실제로 뒤로가기를 눌러도 로그인이 유지된다(브라우저가 쿠키값을 가지고 있으므로).


서버는 쿠키값을 받아와서 올바른 사용자인지 식별한뒤 처리하는 원리이다.

로그인 성공하면 서버가 쿠키값을 발행해주고, 발행에 성공하면 관리자 임의대로 설정이 가능하다.





hash, encryption, encoding


1. hash(해시)

 - 암호화는 아니다.

 - 평문(plain text) → hash value

 - 단방향 함수. 즉, 복호화라는 개념이 존재하지 않는다. 그게 암호문과 비교되는 특징 중 하나다. 

   즉, 다시 평문으로 돌릴 수 없다.

 - 평문에서 해시밸류를 만들었으면 어떤 평문에 의해서 이 값을 만들어냈는지 알아낼 수 없다.

 - 평문에 대한 정보없이, 해시된 값만 알고있는경우 그 평문을 알아내는 방법은 존재하지 않는다.

 - 같은 해시 알고리즘을 이용하는이상, 평문의 길이와 상관없이 hash value의 길이는 고정 길이를 갖는다. 

   즉 평문의 길이와 상관없이 해시의 길이는 동일하다.

 - 평문이 같으면 해시값도 같다.

 - 평문이 다르면 해시값도 달라진다. 

 - 해시 알고리즘은 여러가지가 있다. md4, md5, sha1, sha2, sha256, sha512, ...


 - 노래가사 전체를 해시해도 해시된 값의 길이는 위의 평문 'text'를 해시한 결과와 길이가 동일하게 나온다.

 - 주로 사용될 때

 · 패스워드

   : 만약 해시된값을 패스워드로 넣어두면, 개인정보가 노출되었더라도 해당 패스워드를 평문으로 돌릴수 없다.

*)_ 참고

해당 해시가 나올때까지 브루트포싱 : 크래킹

 - 일반적인 패스워드를 찾는 방법 

 - 1) Brute - force

 - 2) Dictionary Attack : 사용자들이 주로 만들법한 패스워드로 만들법한 단어들을 미리 딕셔너리화 한 뒤

   brute - forcing 하는것이다. 정확도가 더 높고 소요시간이 더 적다.

 · 파일검색

   : 파일검색 또는 네트워크를 통해 받은 파일이 원본과 동일한파일인지 확인할때 사용한다.

*)_ 예시

60GB 짜리 파일 두개를 비교할때, 1바이트씩 같은지를 비교하면 너무 오래걸린다.

근데 각기 파일을 해시밸류로 뽑은다음 그 둘을 비교하면 훨씬 빠른시간내에 가능하다.

(아무리 plain text가 길어도 동일한 해시알고리즘을 거친 파일은 같은길이의 값을 갖는 해시의 특징 이용)


- hash 예시 : 평문 'text' → (sha-1) → 372ea08cab33e71c02c651dbc83a474d32c676ea



2. encryption(암호화)

 - 평문(plain text) → 암호문(cipher text) 이 존재.

 - 키를 필요로 한다. (해시와의 차이점. 평문에서 암호문을 만들때, 암호화 키를 필요로 한다.) 

*)_ 참고

암호화할때 사용하는 키와 복호화할때 사용하는 키가 같은경우 : 비밀키 / 다른경우 : 공개키

 - 암/복화가 가능하다. 즉, 암호문을 가지고 평문으로 다시 바꿀수있다. 

 - 키값 추출이 불가능하다면 복호화하는게 거의 불가능하다. 

 - 평문의 길이에 따라 암호문의 길이도 달라진다.

 - 평문이 같아도 키가 다르면 암호문도 달라진다.

 - RSA, DES, 시저 암호, enigma, ... 이런것들이 잘 알려진 유명한 암호화 알고리즘이다.



 - 암호화 예시 : <Des>"text" → key : 1234 → zrz+cOrgAI4= 

    <Des>"text" → key : 123 → aL8L5K5PcT8=

    <Blowfish>"text" → key : 1234 → JZyhi3jwCw0=



3. encoding(그중에서도 base64 encoding)

 - 64진법 : 모든 문자를 64개의 문자로 표현 (영문 대/소, 숫자 등등..)

 - 위의 암호화 된 zrz+cOrgAI4= 는 암호로 만들어진 암호문을 base64로 다시 인코딩해서 표현한 것이다. 

 - 여러나라의 언어간 서로의 언어의 규칙이 달라 충돌을 방지하고자 하나로 정한게 이러한 인코딩 방식이다.

 - 4바이트 단위로 인코딩이 된다.

 - base64 인코딩인지 알아보는방법 : 주로 맨 뒤쪽에 = 이 붙는경우

 - 4바이트 단위로 인코딩이 되기때문에 12345의 경우 1234 / 5 가 되고, 5만을 인코딩하면 비는 자리수를 = 로 채우기 때문.


*)_ 참고

https://www.tools4noobs.com/online_tools/encrypt/


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함