본문 바로가기
성능테스트

[성능테스트] Jmeter 보안로그인 세션유지

by 오자동K 2022. 4. 30.
반응형
SMALL

보안 로그인 과정은 어디서 사용하나?

우리가 보통 로그인을 하기 위해서 F12 개발자 도구로 보면 내가 로그인한 아이디 비번은 쉽게 확인이 가능하고 이후 세션이 유지될 때에도 그 ID 값이 이어지면서 세션이 유지되는 경우가 보통이다.
로그인/비번 입력창에 아이디/비번 으로 로그인 되는 것이 아니라 암호화 과정을 거쳐서 로그인이 된다.
요새 보안이 강화되어서 이런식으로 암호화를 거쳐서 하는 곳이 많다고 한다.

로그인 암호화 과정을 jmeter 에서 추가해야 하는 이유?

Jmeter 에서 레코딩을 하고 run 을 할 때 
Parameter 로 로그인 아이디와 비번을 다음 api 에서 사용하거나
Response에서 로그인 아이디 비번을 기록해야 하는데
아이디 한개로 레코딩 된 채로 자체 암호화 된 key 값을 계속해서 run 한다면 로그인 세션을 잘 물고 run이 될수도 있기는 하다
하지만 이렇게 아이디 한개의 세션을 가지고 테스트 하는 경우는 별로 없다
그렇기 때문에 csv로 받아서 사용하는 아이디/비번 을 각각 암호화 과정을 적용시켜줘야한다

 

그러면 jmeter 에서는 암호화 과정을 어떻게 적용 할 수 있나?

JSR223 javascript sampler

우선은 jmeter 에서 제공하는 api sampler 중에서 JSR223 sampler 라고 있다
이것에서 javascript, groovy 등등의 언어를 선택하고 실행 시킬 수 있다
js 는 브라우저에서 실행하는 것이고 현재 적용하고자 하는 페이지는 로그인 페이지기 때문에 그 화면에서 f12를 눌러 source 를 확인하도록 한다
그러면 암호화를 의미하는 crypto 부분이 있는 것을 알 수 있고
이 js 들을 실행시켜서 암호화를 하겠다 라고 생각해볼 수 있다
그리고 js 파일들을 하나씩 살펴보고 아이디와 비번을 암호화 하는 부분을 찾아본다

개발자도구에서 해당 element 확인
개발자도구 source 확인


이 부분은 파일을 하나씩 살펴보면서 어디에서 암호화 하는지 해독해야 한다
로그인 화면에서 UI 의 요소를 살펴보는 방법으로 elements 를 찾아보자
그러면 로그인 ID, PWD 넣는 란이나 로그인 버튼 등등의 요소가 어떻게 이루어져있는지 확인 할 수 있다.
우리는 로그인을 하는 시점에 암호화를 한다고 jmeter 레코딩을 했을 때 파악을 했기 때문에 이 부분에서 암호화를 한다고 예상을 하고 살펴보아야 한다
그러면 이 부분에서 암호화를 하는 함수를 확인 할 수 있다
우측 화면을 자세히 보면 아랫 부분에 input name 이 EncryptUserID, EncrypPassword 와 같은 이름을 확인 할 수 있다.
그러면 이부분에서 암호화를 하는구나 라고 생각하고 이제는 소스를 확인해봐야 한다
확인을 해보니 Login.aspx 파일에서 관련 EncryptUserID 를 검색을 통해 확인해볼 수 있었다

페이지 메인 index

 바로 윗쪽을 확인해보니 initKey() 함수를 사용하고 있고
 그 아래 바로 아이디와 패스워드를 인자로 받아서 EncryptUserID, EncryptPassword 에 저장하는 문장을 볼 수 있다.
 그리고 Login.aspx 가장 상단에 보면 함께 구성되어있는 crypto 폴더의 js들을 모두 import 해서 사용하는 것을  볼 수 있다.
그러면 이제 로그인 아이디 비번을 받은 이후에 crypt 하는 부분의 js 함수들을 jmeter 에 넣어서 구현할 수 있는지 시도해 보도록 하자.

Jmeter 에 js 파일 적용해서 디버깅 해보기

이제 앞에서 말한 JSR223 sampler 에서 javascript 를 선택해주고
아래 script 창에 js 파일들을 import 해준다
우리는 따로 파일 트리 구조로 관리하는 것이 아니기 때문에
Crypt 폴더에 있는 js 파일들을 모두 하나의 파일로 구성한다고 생각하고 구현하자
우리의 목적은 아이디/비번을 넣었을 때 암호화 된 CryptUserID 와 CryptUserPassword 를 받아서 다음 api 에 전달해주는 것이다
하나씩 복사 붙여넣기해서 JSR223 sampler 의 script 창에 넣어주자
그리고 run을 돌려보면서 하나씩 오류를 찾아가야 한다

디버깅 상세하게 돌려보기

Run을 해봤더니 navigator 에러가 발생한다

Jmeter 로그창

무엇인지는 모르지만 465번줄로 가보자
가봤더니 explorer , netscape 이런것들이 써있다
그리고 참고로 visual studio code 편집기에 복붙해서 보면 appname을 사용하지 않는 변수라고도 나온다(취소선 처리 되어있음),,,, 주석처리를 해주지만 if else 문의 else에 해당하는 부분은 밖으로 꺼내서 변수를 살려주어야 한다
Appname을 사용하지 않는다는 것은 해당 if문의 else 는 사용하겠다는 의미로 살려주어야 한다
Appname 변수를 사용하는 부분이 여러군대 있을 수 있기 때문에 주석처리를 해주자
그러면 이것들은 실제로 사용하지 않아도 별 문제가 되지 않는다는 것이다
그럼 이부분을 주석처리 해주고 run을 해보자
이번에는 에러 warning 이 발생하지 않는다
하지만 제대로 된걸까?
View result tree 를 봤더니 로그인 부분에서 에러가 발생하고 그 이후로 잘 넘어가지는 것처럼 보인다
로그인 이후 부분들을 보면 페이지에 우리가 로그인 이후의 원하는 내용이 나오는 것이 아니라 그냥 무의미한 정보들이 들어오는 것을 확인할 수 있다
로그인이 잘못되면 그 이후의 세션들이 정상적으로 들어오지 않는 것을 확인하고 로그인에서 어떤 에러가 발생하는지 디버깅을 해야한다

=========한번에 흐름을 따라가기 어려운 부분=============

Login.ajax 스크립트를 보게되면 crypto 로직의 중간에 init() 함수를 지나서 암호화를 시작한다
그러면 뭔가 init() 함수에서 처리하는 과정에 뭔가가 있을 것이다 라고 의심해볼 수 있다
그러면 init() 함수에서 무엇을 처리하고 있는지 봤더니
publicModulus 변수에 key 값을 주고 이것으로 암호화 하는 로직임을 확인했다
그러면 initKey() 함수를 통해서 어떤 값이 나오는지는 알수 없으나 input key 가 들어가는 것을 확인하고 key 값을 셋팅해주도록 한다
publicModulus 변수를 사용하기 때문에 이 값을 그대로 셋팅해준다
바로 적용하기 어렵다면 java script 실행해서 결과를 알고 대입을 하는 것을 추천한다
https://codepen.io/pen/tour/welcome/start?editors=1112 이런 사이트에서
Js 를 붙여넣으면 바로 console 창으로 결과를 보여준다
이렇게 결과값을 눈으로 확인하고 element 창에서 보여지는 것과 동일하게 보여지는지 확인하고 \n 으로 개행도 똑같이 해준다

코드를 visual studio 에 붙여서 js 형태로 보면 좀더 편하게 볼 수 있다

실제로 개행을 안하고 해줬더니 제대로 동작하지 않았다

디버깅 흐름 이어가기

publicModulus 변수를 셋팅 해줄 때는 그 변수를 initKey() 함수 내의 cerParser 안에 인자로 넣어주어야 하기 때문에 기존 코드의 value 값을 가져오는 부분을 주석처리 해주고 publicModulus변수를 직접 인자로 넣어준다
그래서 publicModulus 변수를 initKey() 의 변수로 셋팅 해준 후 jmeter를 실행해보자
그러면 패스워드가 틀렸다고 나올 것이다

왜냐하면 login.aspx-121 API 에서 EncryptUserID 와 EncryptPassword 부분을 변수처리를 해놓았는데 이부분에 암호화 된 값이 안들어갔기 때문이다.
그러면 제이미터에서 JSR223 을 통해서 나온 암호화 return 값을 변수처리해주어야 EncryptUserID 와 EncryptPassword 변수에 입력이 되어 정상 로그인이 될 것이다.
그리고 initKey() 함수 또한 암호화 로직인데 이 부분이 함수만 만들어져 있을 뿐 실행해주지 않았기 때문에 발생한 것이기도 하다.

그래서 initKey() 함수를 호출해주고 
Jmeter의 Vars.put 함수를 사용해서 변수로 처리를 해주도록 하자 
ID PWD 값은 앞애서 CSV 로 처리를 해준 부분이다
변환된 값은 EncryptID 와 encrptPWD에 입력되어 사용 가능하다

결과 확인하기

Bean shell 에 변수를 주석으로 입력해서 확인해볼 수 있다
암호화된 코드가 변수로 넘어와졌다면 정상 처리 된 것이다

Login-aspx-121 이후로 들어오는 데이터가 정상적으로 들어오는 것인지 assertion 처리와 response data 를 통해서 확인을 해주도록 하자.
정상적으로 데이터가 들어왔다면 암호화가 잘 이루어진 것이다.
제대로 처리가 안되었다면 로그인 이후 업무 조회를 해야 하는 경우에 에러가 발생한다.

암호화가 정상적으로 됐다면 로그인 세션을 이어서 업무에 적용할 수 있다.

반응형
LIST

댓글