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

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



지금까지 배운 내용들로

다양한 클래스들을 이해해보겠다.

자바에는 다양한 클래스들을 지원해주는데
오늘 알아볼 클래스는
 Wrapper, BIgInteger, BigDecimal, 난수 생성 함수, 문자열 토큰 이다.

1. Wrapper 클래스

Wrapper 클래스는 기본 자료형의 데이터를 인스턴스화 시키는 클래스이다.
Wrapper란 말 그대로 감싸고 있다는 것이다.

데이터 클래스를 의미한다.

이런걸 Boxing 이라고 하고 반대는 Unboxing이라고한다.
자바5.0부터는

Auto Boxing, Auto Unboxing이 지원 되서
클래스 생성선언 없이도 바로 생성되어 지원된다.

ex)


Integer iValue = 10; // auto boxing
Double dValue = 3.14;
int num1 = iValue; // auto unboxing
double num2 = dValue;


문제 20-1
static 메소드를 이용하여  Boxing 해보아라.

(valueOf(); 메소드 사용)





(실행 화면)



이러한 Wrapper 클래스안에 valueOf 의 메소드가 있다. 이 값을 이용하면 Wrapper 클래스의 인스턴스를 생성할 수 있다.

그런데 결과 화면을 보면 동일한 인스턴스라고 나온다.

저장되는 데이터는 문자열과 같이 수정이 불가능하다. 그렇기 때문에 메모리 효율 상 같은 인스턴스를 여러개 만들 필요가 없는것이다.
값을 변경하려면 새로운 인스턴스를 만들어 참조값을 변경해주면 된다.

현재 iValue1 과 iValue2는 같은 인스턴스를 참조하고 있다.


2. BigInteger, BigDecimal 클래스
매우 큰 수( BigInteger)
가장 표현범위가 넓은 long형으로도 표현이 불가능한 수를 표현할때 사용한다.
ex)

BigInteger bigValue1 = new BigInteger("10000000000000000000000000000");


왜 입력을 문자열로 넣을까?
그 이유는 정수로 넣게되면 그 정수를 옯겨줄 매개변수가 필요한데
가장큰 long형으로도 커버가 안되기 때문에
문자열로 입력해야하는 것이다.

BigDecimal
-> 정확한 소수점 표현

처음 자료형을 배울때 float나 double의 소수점 표현에
오차가 있다고 말했다.
하지만 오차가 없게 표현하려면
BigDecimal 함수를 사용하면 된다.
BigInteger와 같이 문자열로 입력된다.

문제 20-2
두 개의 실수를 입력받아 두 실수의 차를 절대값으로 계산하시오.




(BigDeciaml 이용 코드)




(실행화면)



결과를 보면 오차없이 계산된 것을 확인 할 수 있다.

3. 난수 생성

JAVA에는 java.util 패키지로 Random 클래스를 제공한다.
- boolean nextBoolean()   : boolean형 난수 반환
- int nextInt() : int형 난수 반환
- long nextLong() : long형 난수 반환
- int nextInt(int n) : 0이상 n미만의 범위 내에있는 int형 난수 반환
- float nextFloat() : 0.0 이상 1.0 미만의 float형 난수 반환
- double nextDouble() : 0.0 이상 1.0 미만의 double형 난수 반환

괄호() 안에는 seed 값이 들어간다.
default 값은 System.currentTimeMillis() 이다.
시간에 관련한 seed 값이 들어간다.

4. 문자열 토큰

- 문자열에서 구분자를 이용해 문자열을 구분하는 방법이다.
ex)
14:99 
위 글자에서 ' : ' 를 구분자로 하여 14와 99를 구분할 수 있다.


StringTokenizer st = new StringTokenizer("14:99", ":");

public String nextToken() // 다음 토큰 반환 메서드




(*참조 - 난 정말 JAVA를 공부한 적이 없다구요, 윤성우)





+ Recent posts