거의 3개월만의 포스팅, 근황부터 기록해야할 것 같다.

근황

3월부터 국가근로장학생에 선발되어 네이버 블로그 포스팅을 하는 아르바이트를 진행 중이었다. 워낙 평소에도 글 쓰는 것 좋아했고, 그간 해오던 몸 쓰는 아르바이트에 비하면 이만한 꿀도 없는지라 즐거운 마음으로 돈 벌며 전공수업과 졸업작품을 겸하고 있었는데, 한 달이 되던 차에 매니저님께서 아르바이트생 전체에게 질문을 던지셨다.

“PHP랑 웹 좀 만질 줄 아시는 분?”

웹을 직접 배운적은 없지만 기초지식은 있으니 눈치껏하면 될 것 같고, PHP는 작년 데이터베이스 과목 프로젝트 진행할 때 어느정도 만져보았으니 큰 어려움 없이 어느정도 할만하겠다 싶어 손을 들까하면서 주변의 눈치를 살펴보고 있는데, 귀신 같이 아무도 손을 안들고 있었다.
‘횡재다!’ 싶어 곧장 손을 드니까 매니저님께서도 손 들 줄 알았다며 기뻐해주셨다.

그 이후로는 블로그 포스팅보다는 기존에 만들어져있는 PHP기반 웹페이지들의 잘못된 부분을 수정하는 작업을 주로 진행하고 있는데, 보안성은 떨어지지만 구조는 파악하기 쉬운 깡 PHP로 만들어진 사이트가 있는가 하면, 특징을 이해하기 전까진 구조 파악이 골머리 앓게 어려웠던 카페24로 만들어진 사이트 등 다양한 구조의 웹 사이트들을 경험해보고 있다.
이 과정에서 뼈저리게 느끼는 부분들이 몇 가지 있는데,

  • 주석은 정말 중요하다.
  • 주석은 정말이지 중요하다.
  • 주석은 정말 매우 중요하다.
  • 주석 없이도 한 눈에 파악 가능한 코드를 짜는 사람이 진짜 프로다.
  • 근데 그런 사람이 정말 흔치 않다.

정도가 되겠다. 협업이나 업무의 연속성에 있어 ‘남이 알아볼 수 있게’ 코드를 짜는 것이 얼마나 중요한지 항상 말로만 들어왔는데, 이번 아르바이트를 통해 직접 피부로 느끼는 중이다. 감사해야하나? ^ㅁ^;;;

근황은 이정도로 일단락하고, 갑작스럽게 포스팅을 하게 된 이유는 역시 그만한 임펙트 있는 일이 있었기 때문이지!
수정작업이라는 특성상 한 번에 한 가지 씩 일을 처리하는게 아니라, 여러 가지 수정사항을 계속해서 전달 받고 처리하는 순서대로 완료보고를 하게 된다. 그렇게 일주일 전에 전달 받았음에도, 다른 수정사항들을 다 완료 할 동안 미처 완료하지 못한 수정사항이 한 가지 있었는데, 이놈이 골머리를 계속 썩혔다.

“어느 순간부터 회원가입 진행시 회원이 아닌데도 이미 등록된 회원이라고 가입이 거부된다.”

“어느 순간부터” 라는 점이 굉장히 중요했는데, ‘이전에는 정상적으로 잘 되던 것이 갑작스럽게 되지 않는다.’ 라는 말이었기 때문에 누군가 PHP파일을 건드렸거나, 사용중이던 PHP솔루션(카페24 등)의 업데이트가 있었다던지의 문제로 추측이 되었다. 그러나 솔루션PHP 없이 깡 PHP파일로 관리가 되는 사이트였고, 누군가 PHP파일을 건드리는 쪼잔한 짓은… 정말 아니라 생각했기 때문에 원인 파악을 위해 여러가지 실험을 진행하게 되었다.

기존 코드

<?php
    session_start();
	
    $sitecode = "*****";					// NICE로부터 부여받은 사이트 코드
    $sitepasswd = "************";				// NICE로부터 부여받은 사이트 패스워드
    $enc_data = $_POST["EncodeData"];		// 암호화된 결과 데이타

	//////////////////////////////////////////////// 문자열 점검///////////////////////////////////////////////
    if(preg_match('~[^0-9a-zA-Z+/=]~', $enc_data, $match)) {echo "입력 값 확인이 필요합니다 : ".$match[0]; exit;} // 문자열 점검 추가. 
    if(base64_encode(base64_decode($enc_data))!=$enc_data) {echo "입력 값 확인이 필요합니다"; exit;}
	///////////////////////////////////////////////////////////////////////////////////////////////////////////
		
    if ($enc_data != "") {
				//if (extension_loaded($module)) {// 동적으로 모듈 로드 했을경우
					$plaindata = get_decode_data($sitecode, $sitepasswd, $enc_data);// 암호화된 결과 데이터의 복호화
				//} else {
				//	$plaindata = "Module get_response_data is not compiled into PHP";
				//}
        if ($plaindata == -1){
            $returnMsg  = "암/복호화 시스템 오류";
        }else if ($plaindata == -4){
            $returnMsg  = "복호화 처리 오류";
        }else if ($plaindata == -5){
            $returnMsg  = "HASH값 불일치 - 복호화 데이터는 리턴됨";
        }else if ($plaindata == -6){
            $returnMsg  = "복호화 데이터 오류";
        }else if ($plaindata == -9){
            $returnMsg  = "입력값 오류";
        }else if ($plaindata == -12){
            $returnMsg  = "사이트 비밀번호 오류";
        }else{
            // 복호화가 정상적일 경우 데이터를 파싱합니다.
            $requestnumber = GetValue($plaindata , "REQ_SEQ");
            $responsenumber = GetValue($plaindata , "RES_SEQ");
            $authtype = GetValue($plaindata , "AUTH_TYPE");
            $name = GetValue($plaindata , "NAME");
            //$name = GetValue($plaindata , "UTF8_NAME"); //charset utf8 사용시 주석 해제 후 사용
            $birthdate = GetValue($plaindata , "BIRTHDATE");
            $gender = GetValue($plaindata , "GENDER");
            $nationalinfo = GetValue($plaindata , "NATIONALINFO");	//내/외국인정보(사용자 매뉴얼 참조)
            $dupinfo = GetValue($plaindata , "DI");
            $conninfo = GetValue($plaindata , "CI");
			$mobileno = GetValue($plaindata , "MOBILE_NO");
            $mobileco = GetValue($plaindata , "MOBILE_CO");      
        }
    }
?>
// 기타 코드들
.
.
.

보면 아무런 문제도 없어보이는 멀쩡한 php 코드다. 그런데 계속해서 회원가입 시도 시 이미 존재하는 계정이라고 한다. 이에 대해서 거진 4일 가량을 고민해보았다.

분석 및 설계

처음에는 ‘데이터베이스에 전달되는 쿼리에 문제가 있나?’ 하고 쿼리문을 살펴보았다. 그러나 쿼리문이 변경된 내역은 전혀 없었다. 그 다음으로 살펴본 것은 EncodeData 변수가 사용되는 if조건문들이었다. if조건문을 살펴보던 과정에서 문제점을 발견 할 수 있었는데, 당연히 진입해야할 EncodeData가 if조건문에 진입하지 못하고 빠져나오고 있었다!
왜 진입하지 못할까 고민하던 찰나, echo var_dump() 함수로 EncodeData 값을 찍어보니 EncodeData에 값이 전혀 존재하지 않는다는 것을 발견할 수 있었다. 즉, 회원가입에 기입한 정보가 EncodeData에 들어오지 못하고 있었던 것이다.

즉, NICE 본인인증 과정 자체에서 문제가 있었다.
의문이 풀리기 시작했다. 회원정보를 받아오지 못한채로 비어있는 EncodeData를 파싱해서 데이터베이스에 빈 회원정보를 한 차례저장하고, 또 다시 비어있는 EncodeData를 파싱하니까 이미 등록되어 있는 회원이라고 회원가입이 거절되었던 것이다.

그러나 의문만 풀렸을 뿐, 사태는 더 크게 느껴졌다. 내가 NICE 본인인증을 고칠 방법이 있는 것도 아닌데?
EncodeData에 값이 전달되지 못한다는 건 확인했는데… 그럼 다시 값이 들어오게 하는 방법은 무엇이 있을까?’
계속해서 고민만으로 시간을 보내던 찰나, 현업에 종사하고 있는 친구가 “그럴 시간에 개발가이드 문서나 찾아보라” 라는 잔소리를 했다.
조언(잔소리)에 따라 NICE 홈페이지를 참조하여 개발가이드 문서를 확인해보려 했으나, 도통 보이질 않았다. 결국 지푸라기라도 붙잡는 심정으로 직접 유선전화를 걸어서 현재 상황에 대한 설명을 하고, 개발가이드 문서에 대해 물어보았다.

“아, 그거 얼마전에 Chrome이 업데이트 되면서, 저희측에서도 변경된 사항이 있어요. 공지사항 메뉴에 관련 매뉴얼이 있으니 그거 참고해보시면 될 것 같아요.”

예? Chrome 업데이트? 전화를 끊자마자 바로 익스플로러로 접속해서 회원가입을 진행해봤다.
아… 정말 잘 동작한다. Chrome 업데이트 때문에 발생한 문제였다.
NICE에서 제공되는 개발 매뉴얼을 참고해서 EncodeData를 가져오는 부분을 수정해보았다.

수정 코드

<?php
    session_start();
	
    $sitecode = "*****";					// NICE로부터 부여받은 사이트 코드
    $sitepasswd = "************";				// NICE로부터 부여받은 사이트 패스워드
    $enc_data = $_REQUEST["EncodeData"];		// $enc_data = $_POST["EncodeData"];

// 기타 코드들
.
.
.

정말 귀신같이 잘 동작하더라…

고찰 및 후기

결국 친구의 잔소리가 큰 조언으로 돌아오게 되었다. 개발 가이드를 찾아볼 생각을 하지 않았다면 몇 날 며칠 동안 계속해서 삽질을 하고 있었을텐데…
이번 일을 겪고 나니까, 겨울방학 인턴 때 DART전자공시 사이트 API를 잘못 건드려서 회사 전체 IP가 접속이 안되는 바람에 DART전사공시 사이트 전산쪽에 연락해서 해결방법을 물었던 때가 새록새록 생각났다.
개발 머리를 키우는 것과는 별개로, 일을 잘 효율적으로 처리하기 위해선 기존 문서부터 잘 확인해보아야 한다는 것.
그래야 업무효율도 증가하고 내 개인 시간도 챙길 수 있다는 것… 싸게싸게 잘 배웠다.

연구원처럼 개발 머리에 올인할 것이 아니라면, 일머리를 키우는 것도 꽤나 중요한 것 같다.
내 일머리도 잘 커가길 바라면서, 오늘의 포스팅 끝!

태그:

업데이트:

댓글남기기