|
'Programming'에 해당되는 글 15건
[Yuno.org, 2010/03/20 13:17, Programming/Development Story]
몇년 전에 읽었던 "조엘 온 소프트웨어"라는 책이 있습니다. 혹시 아직 안보신 개발자 또는 개발자와 함께 일하시는 분들은 한번 읽어 보시기를 추천합니다 ; 이 책의 22장에 보면 " 테스터를 두지 않는 (잘못된) 다섯가지 이유 " 라는 부분이 있습니다. 다섯가지 이유를 저자는 1) 버그는 프로그래머가 게을러서 생기니까요. 2) 우리 소프트웨어는 웹에 올려놓아서 버그는 금방 고쳐질 수 있으니까요. 3) 고객이 소프트웨어를 테스트해줄 테니까요. 4) 우수한 테스터는 테스터로 일하려고 하지 않거든요. 5) 테스터를 고용할 돈이 없으니까요. 로 들고 있습니다. 이러한 이유를 들어서 테스터를 두지 않는 다면 멍청한 짓이다! 라고 저자는 이야기 하고 있습니다. 저 역시 이 부분을 상당 부분 동감합니다. 제가 지금까지 보고, 겪은 거의 모든 회사는 출시 전날까지 작업을 합니다. 심지어는 패키징 하기 직전까지 코드 작업을 하는 경우가 있습니다. 그나마 그 작업이 버그 수정이라면 다행이지만, 기능 추가와 같은 신규 코드 작업도 있습니다. 그리고는 그냥 업로드 해버립니다. 가끔은 그럴때, 그런데 이거 테스트 없이 그냥 풀어도되나요? 라고 물었을때 거의 모든 사람의 경우 (심지어 나 역시) "테스트 서버(베타 서버)에 올릴 것이니까 괜찮아, 버그 테스트는 유저들이 해줄테고 리포트 들어온거 수정해서 다시 패치 하면 되지" 라는 말을 합니다. (반성중) 바른 자세일까요? 네. 마치 이건 도덕 시험 같습니다. 누구나 저런 자세가 옳다고는 생각하지 않습니다만 "현실"을 생각하면 어쩔 수 없다는 거죠. 네. 저도 현실을 생각해서 저렇게 행동하고 답 했습니다. 그런데, 왜 현실을 고려 할 수 밖에 없는 것일까요? "테스터를 고용할 돈이 없으니까요" 라고 말합니다. 와우! 다섯가지 이유를 하나씩 정말 다 따라갑니다! 버그가 없이 프로그램을 작성 할 수 있는 프로그래머는 세상에 없습니다. 버그는 프로그래머가 미처 생각하지 못하고 지나친 부분에서 발생합니다. 버그는 프로그램에게는 필연적인 존재입니다. 어떻게 해서든지 출시전에 그 문제점을 찾아서 프로그래머에게 전달을 해야 합니다. 기업에게 있어서 "이미지"라는 것은 매우 중요한 요소입니다. 유저(고객)에게 각인 되는 이미지 중에서 제일 강한 녀석은 바로 첫 인상이죠. 사람과 마찬가지 이지만 말이죠. 어쨋든, 고객이 다운로드 받은 프로그램을 실행 했는데 어처구니 없는 버그가 나온다? ... 그 엄청난 이미지 훼손을 회복하는데 걸리는 시간은 예상을 뛰어 넘습니다. 또한 만약에 그것이 이미 시장에서 어느 정도의 점유율을 차지 하고 있는 제품이 아닌 신규로 릴리즈 된 녀석이라면 시장의 기대 값은 정말 순식간에 0점까지 치닫게 됩니다. 고생은 고생대로 하고, 욕은 욕대로 먹고.. 한 국가에만 릴리즈 되는 것이라면 그나마 이정도 선이지만 해외 파트너사로 릴리즈 했을때는 ... 이거 참 난감해집니다. 이러한 문제는 테스터 조직을 갖추게 된다면 상당 부분 해결이 되지 않을까요? 테스터는 꼭 전문가여야 할 필요는 없습니다. 특정 고객층을 목표로 배포 되는 프로그램이 아닌 대부분의 프로그램은 불특정 다수에게 배포 되어 사용이 되어집니다. 테스터 조직을 전문적으로 관리해줄 관리자와 일반 사용자 처럼 해당 프로그램을 사용해줄 테스터만 있어도 충분한 효과를 낼 수 있습니다! 출시가 잦아서 잦은 테스트가 필요한 제품이 아니라면, QA 조직의 대부분을 임시직 (계약직을 비롯한 파트타임 아르바이트)으로도 충분합니다. 오히려 불특정 다수에게 배포 되는 프로그램은 전문적 지식을 갖추지 않은 일반인 파트타임 아르바이트가 더 효과적일 수도 있습니다. 아니면 해당 소프트웨어를 사용하는 사람들 중에 일부를 파트 타임 아르바이트로 고용해서 테스트를 진행 하게 할 수도 있습니다! 버그가 발견 되면 프로그래머는 슬퍼 할 수 밖에 없습니다. 내 자식 같은 코드에서 버그가 .... 가 아닌 한 밤중에 끌려 나올수도 있기 때문입니다!!! 한 밤중에 긴급 점검을 위해서 택시를 타야 하는 경우, 얼마나 가슴이 아픈지 모릅니다. 테스트 조직에 모든걸 다 해결해 주리라고는 믿지 않습니다. 다만, 테스트 조직의 QA 단계를 지나치면서 고객에게 가는 버그의 수를 줄이고, 버그에서 깍아 먹는 회사 이미지를 보호하고, 한 밤중에 긴급 점검으로 끌려 나오는 빈도 수를 줄이기는 해주리라고는 믿습니다. 아, 그렇다고 프로그래머에게 테스트를 맡기면 안됩니다. 프로그래머는 테스트를 싫어합니다. 또한 테스트를 진행해도 일반 테스터 보다 버그 발견률이 낮을 수도 있습니다. 그것은 아이러니 하게도 프로그래머는 정상적인 방법으로만 사용을 하는 경향이 크기 때문입니다. 하지만, 애시당초 정상적인 프로세스 상에서 버그가 발견 되서 출시 되는 경우는 적습니다. 일반 사용자는 정상적은 방법으로만 사용하지 않습니다. =_= 아 뭐 .. 그냥 테스트 전문 조직이 있었으면 좋겠다는 푸념이었습니다. 버그 없는 게임을 만들어서 유저에게 욕을 그만 먹었으면 좋겠습니다. ㄷㄷ 이제는 청춘불패나 보러 가야겠습니다. ...; p.s 테스트 조직에게 출시 거부권이 있다면 더 좋겠지만, 현실적으로는 힘들겠군요. 어떤 회사도 출시를 늦출리는 없을테니 프로그래머를 더 쪼아서 ... ... 저도 프로그래머인지라 차마 더 쪼임 당할 수 있는 발언은 차마 할 수가 없군요 ㅋㅋ 'Programming > Development Story' 카테고리의 다른 글
[Yuno.org, 2010/03/19 13:18, Programming/Development Story]
종종 이런 이야기를 듣습니다. "프로그래머는 너무 방어적으로 일을 하는 것 같다." 라는 말이죠. 어떤 의미일까요? 예를 들어서 소프트웨어 개발 회사에서 어떤 프로젝트를 진행을 할때 그 프로젝트의 목표를 구현 하는 일을 소위 기획이라고 합니다. 기획자들은 충분한 시간을 가지고 이 프로젝트의 진행 목적 부터 진행 중간 단계의 표현, 기능 들에 대해서 진지하게 고민합니다. 그렇게 해서 (예제로써) 약 버스를 만들기로 했습니다. 그리고 이것에 대한 내용과 스케쥴을 기획서에 작성을 해서 그 기획서를 들고 프로그래밍 조직으로 찾아가서 이야기 합니다. "이것을 언제까지 만들어주세요." 그러면 프로그래머는 기획서를 쭉 살펴보고 기획서가 너무 부실하다고 생각합니다. 기획서에 써 있는 것들이 어떤 목적으로 구현이 되는 것인지, 그리고 또 어떠한 내용인지 확실히 알 수가 없습니다. (물론 아닌 경우도 있습니다.) 그리고 이것 저것 하나씩 묻기 시작하고, 실제 구현 방법에 대해서 하나씩 생각을 해보기 시작하고 나서 대부분은 이렇게 말합니다. "그때까지는 힘들겠는데요.." 라는 말과 함께 협상을 시작합니다. 그리고 프로그래머는 구현해야 하는 기능 중에서 구현이 애매 모호하거나 시간이 오래 걸릴 것 같은 기능들을 구현이 편한 방향으로 변경을 시도합니다. 때로는 이것은 기획자의 의도와는 좀 다른 방향으로의 결과물을 불러오기는 합니다만 이미 대부분의 상황에서 기획자와 프로그래머는 "협상" 단계에 들어가 있기 때문에 기획자도 그것을 받아 들입니다. 그렇게 해서 최초 목표였던 버스는 승합차가 되어 돌아오게 됩니다. 그리고 그것은 출시 됩니다. 지난 몇년간 게임 회사에서 일 하면서 경험하고, 봐왔던 현상입니다. 기존에 다른 회사에서 일 했던 경험을 바탕으로 한다면 다른 회사 역시 대부분은 저런 흐름을 비일비재하게 겪고 있을 것 같습니다. 프로그래머들은 어째서 저런 방어적 입장을 취하는 것일까요? 공식적인 이유로는 이러한 이유들이 있습니다. 1) 기획자가 정말 무리한 일정을 가지고 온 경우, 2) 일정을 아무리 길게 잡아도 아에 불가능한 것을 요구 하는 경우. (예를 들어 기존에 사용 하고 있던 코볼의 코드를 C#으로 완벽하게 포팅 해주는 프로그램을 만들어 주세요. 와 같은), 3) 나의 일을 줄이기 위해서. 4) 기타.. 어떤 것들이 있을까요? ... 어떤 이유일까요? 사실 이런 이유는 중요한게 아닙니다. 위에서 말한 어떤 이유라고 하더라도 그것은 사실상 개별적 해결이 불가능 하기 때문입니다. 저는.. 이런 일이 발생 하는 이유가 바로 '협상' 단계가 생길 수 밖에 없는 업무 흐름 때문일 거라는 생각이 듭니다. 완전한 갑을 관계에서는 '협상' 따위는 없겠죠. (경우에 따라서는 아주 조금 있을지도 모르지만-_-) 그렇다고 해서 갑을 관계를 형성 하라는 것은 아닙니다. 같은 회사안의 조직이기 때문에 그렇게 해봐야 조직간의 분열을 더 초례 할 뿐입니다. 그렇다면 이렇게 해보는건 어떨까요? 기획자는 처음에 기획을 구상 하는 단계에서 이것의 간단한 '목표' 만을 설정합니다. 그리고 기획 회의를 진행할때 실무자 또는 실무자에게 충분한 영향을 줄 수 있는 사람을 함께 하는 겁니다. 뭐야 이게? 라고 생각하는 분들도 있을 것 같습니다만, 실제 기획을 구체화 시킬때 실제 구현자인 프로그래머가 참석해서 함께 회의를 진행한다면 '협상' 단계 따위는 오지 않습니다. 네, 물론 그 '협상' 단계가 기획 회의에서 이루어지게 됩니다. 하지만, 그 수준이 명확하게 다릅니다. 왜냐하면, 기획 회의에서는 간단한 목표만 정해져 있을뿐, 이것의 정확한 기획 결정이 이루어지기 전이기 때문입니다. 기획 회의에 프로그래머가 참여를 한다면 프로그래머는 그 기획 회의에서 내가 어떻게 방어적 입장을 취할까를 고민하지 않습니다. 말 그대로 기술적인 지식을 바탕으로 그 기획에 함께 참여하게 됩니다. 또한 기획 회의에서는 해당 작업을 해야 하는 목적 등에 대한 고민이 이루어지므로 기획서에서는 그냥 지나치는 (또는 아에 나와 있지 않은) 작업의 목적(사실상 동기)를 프로그래머와 함께 공유 할 수 있게 됩니다. 이것은 프로그래머에게 기존의 방식 보다는 조금 더 주인의식(?)을 부여 할 수 있는 방법이 아닐까 싶습니다. 실제 프로그래머들을 참석 시킬 경우 기획자가 생각하지 못하는 기술적인 지식을 이용한 좋은 방향이나 아이디어가 나오기도 합니다. 손해 볼건 없다는거죠. 또한, 프로그래머가 참여 하므로 애시당초 불가능한 기능에 대해서는 기획 회의에서 충분히 걸러 질 수 있습니다. 그리고 결정 되어지는 것들에 대하여 그 자리에서 프로그래머와 함께 스케쥴 임시 계산이 가능하므로 스케쥴 문제 역시 크게 해결 할 수 있습니다. 어차피 스케쥴 협상을 할 거라면 회의 단계에서 미리 하는데 시간을 아끼는 방법이기도 하죠. 그냥 단지 프로그래머가 기획 회의에 참여 하는 것만으로 기존의 '협상' 단계를 없애거나 최소화가 가능해지지 않을까요? 네. 뭐 그냥 그렇다구요. 'Programming > Development Story' 카테고리의 다른 글
[Yuno.org, 2009/07/04 02:24, Programming/Code Story]
최근에 VS 2003으로 프로젝트 컴파일을 하면 이상하게 디버거가 죽어버리는 현상을 겪고 있다. 로컬라이제이션을 위해서 SVN에서 Branch를 따서 코드 관리를 하고 있는데 가끔 여러 코드를 동시에 컴파일해서 배포 해야 하는 경우가 생긴다. 그러던 어느날 부터 갑자기(!) 비주얼 스튜디오로 컴파일 하고, 링커가 결과 물을 뱉어 낸 후에 디버거가 달라 붙어서 실행 되는 순간! vs 2003이 뻗어버린다. -_- process를 봐도 보통 160mb 정도의 메모리와 함께 실행 되는 녀석이 300kb 정도만 로드 하고는 그대로- 침묵. 한참을 기다려도 소용이 없다. 수차례 시도 하면 결국은 한번쯤 무사히 실행이 되는데 이때 첫 실행때는 vs2003이 좀 바보가 된다. 이때 실행된 프로젝트 파일을 정상 종료하고 다시 실행하면 그 다음부터는 전-혀- 문제 없이 작동하는 이상한 현상이 계속 나타나고 있다. 젠장! 오늘도 10분이상 10번도 넘게 실행했다가 vs 죽이고, 실행 했다가 죽이고를 반복하고 겨우 실행.. 짜증 정말.. 그래서 2003을 버리고 안정적일 것만 같은 2005로 가기로 결정! 추가 작업이 필요 할 것 같아서 소스 코드 사본을 하나 더 만들고 사본에서 2005으로 변환 작업 시작. ... 이게 정말 2003에서 컴파일 되던게 맞나 싶을 정도로 쏟아져 나오는 에러들.. 무난했던 에러들은 const static var 선언 같은 이전 버전에서는 암묵적으로 int 형으로 받아주는 것들이 이제는 깐깐해져서 나오는 에러인 C4430 에러 백개 정도는 단순히 형 타입을 써주는 것으로 해결. 함수포인터 전달 관련 오류인 C3867 에러 백개 정도는 단순히 & 을 붙여주는 것으로 해결. 그리고 제일 짜증나는 std 오류 백만개. std에서 stdext로 옮겨가버린 stl의 자제 분들은 변환 작업으로 손쉽게 변환 되었지만 문법 자체가 변해버린 경우는 혹시 잘못 작동 할까봐 쉽게 수정이 조심스러워졌다. 쳇. 그리고는 시간 관계상 포기. 그리고 나서 확인해보니 Visual C++ 2005 컴파일러의 주요 변경 사항을 보니 이제 안되는게 참 많구나.. 라는 생각이 든다. 조만간 날 잡아서 오류들 전부 해결 하고 아무도 모르고 한번 팀에 바이너리 배포 해봐야겠다. 아무도 이상한 점을 발견 하지 못한다면 정상적으로 포팅 한거겠지.. 아 이런것 좀 누가 와서 걍 해줬으면 좋겠다. 'Programming > Code Story' 카테고리의 다른 글
[Yuno.org, 2009/04/12 05:58, Programming/Code Story]
NSIS ( Nullsoft Scriptable Install System )을 사용해서 소프트웨어를 패키징 & 배포를 할때 비스타에서 문제점이 발생한다. 물론 배포 전에 각 OS 별로 테스트를 진행하지만 어떤 조건이 갖추어진 경우에만 티가 나는 경우가 있어서 짜증을 불러 온다. 모든 문제는 Vista의 UAC ( User Account Control )에서 부터 시작 되는 문제이다. Microsft가 Vista를 출시 하면서 기존에는 그다지 신경 쓰지 않던 사용자 계정 간의 보안 문제를 적용하기 시작했다. 즉 계정 별로 시스템에 큰 영향을 줄지 모르는 것들에 대해서 제한적으로 실행을 허가 하는 기능을 추가 한 것이다. 프로그램을 설치 할때 일반적으로 시스템 정보에 접근해서 레지스트리, 유저별, 전체, 단축 아이콘, 바탕화면 아이콘 등을 작업하는 설치 프로그램 역시 UAC의 영향을 받게 되어 버린것이다! 현재 리포트 되어 있는 대표적인 2 가지 문제는 전부 UAC 서비스를 사용하지 않는 상태에서는 문제가 전혀 발생 되지 않는다. 첫번째 문제, Vista에서 대용량 실행 파일을 관리자 권한으로 실행하면 UAC 의 영향을 받아서 소프트웨어 구동 시간이 매우 오래 걸린다. ( 소니 TZ 노트북에서 200MB 짜리 단일 NSIS 설치 파일 실행시 약 20초, 1.5GB 짜리 실행시 약 1분 이상, 거의 10MB당 1초의 구동 대기 시간 소요 ) 결국 이것은 사실상 비스타의 버그!!!!! 이 문제는 예상되는 바로는 UAC가 실행 되는 파일을 전체 검사를 하여 인증서와 같은 것을 검색 하는 것으로 보인다. (관리자로 실행 하기 위해서 manifest 파일 같은 것을 응용 프로그램에 포함시키기도 하기 때문에) 두번째 문제, Vista에서 User 권한으로 프로그램을 설치 하려 하면 관리자 권한 (Administrator )의 폴더에 접근을 할 수 없으며 단축 아이콘 및 레지스트리에 접근이 불가능하다. 아쉽게도 첫번째 문제는 아직 해결 방법이 없다. NSIS 에서 컴파일을 할때 RequestExecutionLever 을 User 로 설정해서 실행 권한을 낮추면 문제 없이 정상적인 속도로 실행이 된다. 하지만 이 경우에는 바로 두번째 문제에 봉착 하게 되어진다. -_- 첫번째 문제를 해결 하는 제일 좋은 방법은 설치 파일을 분할 하는 것이다. 이것은 NSIS에서 분할 파일 배포 방법( http://www.yuno.org/295 ) 을 이용하면 된다. 두번째 문제는 NSIS의 UAC 플러그인을 사용하면 된다. UAC Plugin은 사용자 권한(USER LEVEL)로 실행 되었을 경우 내부에서 해당 실행 파일을 다른 프로세스를 이용하여 관리자 권한으로 다시 한번 실행 시켜주는 방식을 통해서 두번째 문제를 해결 하고 있다. 하지만 첫번째, 두번째 문제가 엮인 경우 두번째 문제를 해결 하기 위해 UAC 플러그인을 사용하면 다시 첫번째 문제로 돌아가게 된다는 것을 명심하자. ( 쪼개는 방법 밖에 없단 이야기 ) 또한 UAC 플러그인은 유저단의 아이콘 만들기 라던가, 유저 레벨로의 별도 실행 파일 실행 등의 기본적인 기능을 포함하고 있다. 만약 두번째 문제만 겪고 있을 경우는 UAC Plugin으로 가볍게 문제를 해결 할 수 있다. 이것과 관련된 NSIS Forum의 thread가 있으니 한번 읽어 볼만하다. 'Programming > Code Story' 카테고리의 다른 글
[Yuno.org, 2008/11/02 02:19, Programming/Code Story]
'Programming > Code Story' 카테고리의 다른 글
[Yuno.org, 2008/09/09 00:35, Programming/Code Story]
말랑양이 원해서 한시간에 걸쳐서 만들어 본 것 스킨 코드 보기 'Programming > Code Story' 카테고리의 다른 글
[Yuno.org, 2008/08/02 00:58, Programming/Code Story]
NSIS(Nullsoft Scriptable Install System)는 어느새인가 국내 배포 프로그램에서 나름 차지 비율을 높여만 갔다. 아직 해외에서 발매되는 주요 상용 소프트웨어는 Install shield를 쓰고 있지만 전 세계의 수 많은 공개 프로그램들은 NSIS를 사용하고 있다. 'Programming > Code Story' 카테고리의 다른 글
[Yuno.org, 2008/06/17 23:32, Programming/Development Story]
Visual Studio 2003을 쓰고 있기 때문에 만약 Visual Studio 2005 나 Visual Studio 2008에서는 이러한 문제가 없을지도 모른다. 하지만 난 오늘 Visual Studio 2003 때문에 고생을 좀 했다. 게임에 들어가는 UI 관련 그래픽 데이터를 별도의 툴 (아하 Skin Editor)에서 작업을 한다. Skin Editor에서 작업한 데이터는 바이너리 파일로 변환되어 Windows의 각 윈도우와 예하 컨트롤 처럼 바이너리 구조로 저장 된다. 그리고 저장된 바이너리 데이터의 구조를 게임 클라이언트에서 로드 할 수 있도록 별도로 클라이언트 코드에서 선언 할 수 있도록 enum 구조를 뱉어낸다. 클라이언트 프로그래머는 이것을 각 컨트롤 또는 윈도우의 클래스에 첨부 함으로써 클라이언트에서 UI를 윈도우 개념으로 핸들링 가능하게 된다. 그런데...................... 이건 뭥미? -_- 오늘도 새 UI 작업을 완료해서 저장을 하고 저장을 하고 컴파일을 하고 실행 하니 대뜸 나는 오류.. "더 이상 실행할 코드가 없습니다!" 응? 응? 응? 응? 그럼 니 뒤에 줄 서 있는 백만줄은 뭔데? 주석이냐? ...그때부터 싸움은 시작 됐다. 스킨과 관련 된거라는 경험에 의해서 확신이 들고 있었으므로 혹시 스킨을 핸들링 하는 클라이언트 코드에 Over Flow가 있는지 코드에서 변수와 각 메소드의 파라미터를 하나씩 까보기 시작했다. 없었다. 그렇다면 엄청나게 많기는 하지만 에러가 나는 부분이라고 생각 되는 몇 곳에 Break Point를 살며시 놔두고 코드를 따라가기 시작, 상위 Window 개념중에 하나인 Holder Count가 실제 Holder Count와 데이터 바이너리에서 로드한 Holder Count가 달라서 생긴 문제라는 사실을 확인. 일단 데이터 오류를 의심하고 다시 에디터를 통해 저장 해보았지만 역시나 이상 무. 젠장! 에디터 소스를 열고 에디터에서 저장되는 구조에서 문제가 없는지 확인했다. 역시 여기서도 모든 변수들이 충분한 크기를 예상하고 만들어져 있었다. 대체 뭥미?! 데이터를 Hex Editor에서 열어서 확인 해 볼까? 하는 고민중에.. 문.득. 정말. 그냥 문.득. 전체 컴파일을 해보고 싶었다. 그리고 약 15분후. 이런 ................................. 링크 하다가 오류가 난거던지, 아니면 일부 코드의 변화 여부를 파악 못해서 목적 파일이 예전 것임에도 불구하고 목적 파일을 생성 안해서 논리 오류가 난 것인지. 알 수는 없다. ( 후자라고 예상 하고 있다 ) 하지만, 어쨋든 새 목적 파일을 새로 다 생성하고 난 후에 링크 한 바이너리는 에러 없이 쌩쌩 작동 되었다. 흑. 앞으로는 종종 '솔루션 전체 다시 컴파일' 버튼을 사랑해주어야 겠다. ㅠ_ㅠ. 'Programming > Development Story' 카테고리의 다른 글
[Yuno.org, 2007/12/16 07:23, Programming/Code Story]
iterCur = this->MemberList.begin(); for ( ; iterCur != iterEnd ; iterCur++ ) iterCur = this->MemberList.begin(); for ( ; iterCur != iterEnd ; iterCur++ ) for ( iterCur = iterBegin; iterCur != this->MemberList.end(); iterCur = iterNext ) { 'Programming > Code Story' 카테고리의 다른 글
[Yuno.org, 2006/12/15 00:45, Programming/Development Story]
이게 과연 Programming 분류에 들어가야 하나 싶지만. 아무튼. 웹은 그 태생의 한계 때문에 여러 시스템을 구현할때 다양한 편법이 이용되어진다. 처음에는 편법이었지만 시간이 지나갈수록 당연시 되어지고 그 헛점 조차 그 편리함에 덮혀지는 뭐 그런.. 방금전에 뉴스 사이트를 보다가 이러한 기사를 보았다. http://news.naver.com/news/read.php?mode=LSS2D&office_id=032&article_id=0000203799§ion_id=102§ion_id2=249&menu_id=102 대략 요약하자면 인터넷 쇼핑몰에서 별도의 결제 사이트를 연동하여 결제할때 주고 받는 통신을 위조해서 적은 금액으로 물건을 구매 하는 행위에 대한 이야기다. 이거를 처음 발견했던건 3년쯤 전이었다. 보통 대형 쇼핑몰이 아닌 일반 쇼핑몰들의 결제 시스템은 결제 대행 서비스를 이용한다. 또한 결제 대행 서비스 업체들은 자체 보안 때문에 쇼핑몰 서버에 별도의 모듈을 제공하는게 아닌 본인들이 제공하는 특정 페이지를 연결해서 관련 정보를 받아서 처리하고 해당 결과를 쇼핑몰 호스트로 다시 넘겨주는 작동 방식을 가진다. 이 문제는 결국 쇼핑몰의 결제 시스템은 결제 여부를 대행 업체의 결제 시스템에 의존하게 된다는거다. 두 호스트는 물리적으로 연결 되어 있지만 단일 랜 선이 아닌 인터넷을 넘나드는 공개된 패킷에 의해서 주고 받게 된다. 이는 쇼핑몰 솔루션의 호환성과도 직접적 관계가 있기 때문에 일반적으로 (지금은 어떨지 모르겠지만) GET, POST 와 같은 단순 전송 방식을 사용한다. 차라리 서비스나 데몬이 돌면서 TCP/IP 를 통한 직접 통신이면 나을지도. 아무튼, 그러한 통신은 결국 한번이라도 그러한 시스템을 구축해보거나 시스템 구조를 아는 사람에게는 허약하지 그지없다. 대표적이로 두가지 취약점이 여기서 들어난다. 1. 쇼핑몰에서 대행 업체로 보내는 결제 조건 정보. 즉, 금액과 결제 방식 등의 정보의 공개 문제 2. 대행 업체에서 결제 완료후에 쇼핑몰로 결과를 전송할떄의 문제 이 두가지 문제는 모두 사용자(클라이언트. 여기서는 브라우저)를 거친다는것에 있다. 이중에 제일 쉽게 접근이 가능한 첫번째 문제는 매번 우리가 결제할때 쇼핑몰에서 결제 정보를 브라우져에 특정 URL에 특정 파라미터(위의 결제 정보)를 가지고 열도록 명령하고 그 정보는 사용자 브라우저에 그대로 남은 상태로 해당 페이지로 가게 되는거다. 즉, 해당 페이지를 열때 넘어오는 파라미터를 변경하면 결국 그 파라미터대로 페이지가 열리게되고 이는 위의 기사에서 나온 것 처럼 금액의 변경으로 쉽게 이어진다. 결국 대행 업체의 솔루션은 받은 금액 그대로 (변경 여부는 알 수 없으므로) 결제를 하게 되고 그 결과를 쇼핑 솔루션에 통보 하게 되는거다. 여기서 결국 쇼핑몰 솔루션을 개발한 사람의 완벽성에 영향을 받게 되는데 어지간한 대행 업체는 결과를 보낼때 대략 요청한 결제 번호 (주문 인덱스 넘버와 같은 인덱스 넘버), 금액, 결제 정보 등을 넘겨준다. 결국 이곳에서 결제 번호(인덱스)만으로 결제 여부를 처리 해버리면 백만원짜리를 만원을 결제 했든, 십만원을 결제 했든 해당 주문번호의 결제 여부는 처리가 되어 버리고 완료 처리가 되어 버릴것이다. 이것 저것 크로스 체크를 하는 개발자라면 돌아온 결제 정보의 금액까지 확인 해서 크로스 해야 할 것이고 2번의 문제 역시 막기 위해서 해당 정보를 전송한 호스트의 주소 역시 크로스 체크 해야 한다. 물론 이것도 작정을 하고 스누핑 한다면 대책이 없겠지만 -_- 어쨌든 가급적 결제 시스템과 같은 예민한 시스템은 클라이언트에서는 입력만 받고 모든 전송 및 처리는 호스트에서 처리 하는게 제일 안정적이다. 쩝. 저 기사를 보니까 그때 내가 테스트 했던 10곳의 쇼핑몰중에 저 방법이 통하지 않았던 곳은 단 두곳밖에 없었다는 기억이 다시 새록 떠 오른다. 난 차마 지르지는 못했는데 ... 'Programming > Development Story' 카테고리의 다른 글
[Yuno.org, 2006/11/22 12:31, Programming/Code Story]
게임 케릭터 미리 보기 작업을 하느라 처음으로 ASP.NET C#을 이용해서 그래픽 파일을 브라우저로 전송하는 코드를 작성할 일이 생겼다. 'Programming > Code Story' 카테고리의 다른 글
[Yuno.org, 2006/10/20 22:52, Programming/Development Story]
필자가 처음에 WEB을 접했던건 아주 오래전이다. 아직 VT 기반의 통신이 주였고 많은 사람이 VT 기반의 통신을 시작하기 시작할때 였다. 당시에 두산에서 서비스 하던 인터피아라는 유료 계정 서비스를 이용하여 처음으로 UNIX SHELL을 접하게 되었고, 그 이후에 ppp 또는 slip 서비스를 이용해서 처음으로 WEB을 접했을때는 정말 놀라웠다. 'Programming > Development Story' 카테고리의 다른 글
[Yuno.org, 2006/10/12 17:56, Programming/Code Story]
구글(Google)의 R&D 센터가 한국에 생긴다. 조금이라도 IT나 인터넷, 프로그래밍.. 이런 이야기에 관심이 있는 사람이라면 이런 저런 이야기가 많이 듣거나 봤을 것이다. 구글의 사무실 분위기 사원 복지 정책 등을 보고 있자면 소프트웨어 엔지니어의 천국이라는 생각이 들 정도이다. << 풀어본 답 열기 >> 'Programming > Code Story' 카테고리의 다른 글
[Yuno.org, 2006/09/30 11:35, Programming/Development Story]
완료 된지 시간이 조금은 지난 프로젝트. 게임으로 따지면 서비스가 시작된지 조금 된 게임들. 프로그램으로 따지면 최초 개발 이후 고객에 따라서 커스터마이징을 하고 있는 과정 정도에 있는 경우에 해당한다. 'Programming > Development Story' 카테고리의 다른 글
[Yuno.org, 2006/09/30 03:14, Programming/Code Story]
많은 프로그래머들이 겪고 있는 신비로움일까. 아니면 무지에서 나오는 결과일까. 내가 속한 팀에서는 대부분 사내 테스트이 경우에는 디버그 버젼의 클라이언트를 이용해서 사용한다. 더 많은 클라이언트, 케릭터 정보, 많은 로그들을 얻을 수 있다는 장점이 릴리즈 버젼의 클라이언트 보다 더 크게 작용하기 때문이다. 'Programming > Code Story' 카테고리의 다른 글
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||




