Top Coder RAW novel - Chapter (5)
탑 코더-5화(5/303)
# 5
마법 같은 능력
────────────────셋은 회의실로 자리를 옮겼다.
“아직 말씀 드릴 단계까지 구현하지 못했습니다. 토큰을 파싱하는 부분도 하드코딩 되어 있고, 인증 생성부도 하드 코딩 되어 있어요. 검색 결과가 제대로 나오는지 테스트도 좀 더 필요하고요.”
“그건 내가 판단 할 테니까. 방금 했던 설명 다시 한 번 해봐.”
최기훈의 지시에 승호는 더 이상 뒤로 빼지 않았다. 황시내가 조마조마 한 표정으로 승호를 보았다.
“그러면 제가 하려고 했던 것과 현재 까지 되어 있는 부분을 말씀드리겠습니다.”
승호는 논리 정연하게 설명을 이어나갔다.
그렇게 수 분이 지난 뒤.
승호의 말에는 크게 빈틈이 없었고, 최기훈은 고개를 끄덕이는 것으로 동조했다.
“나도 자네와 비슷한 생각이야. 찾아보면 더 나은 방법이 있을 수도 있지만 일주일 안에는 그 정도까지 구현하는 것도 거의 불가능에 가까우니 까.”
“그래서 최대한 심플하게 가져가려 합니다.”
“구현은 어디까지 됐다고?”
승호의 대답에는 막힘이 없었다.
“일단 사용자 생성에서 부터, 권한별 색인, 권한별 검색까지. 전체 데이터 플로우는 확인했습니다. 이걸 좀 더 다듬는 작업이 남았습니다.”
“일정은?”
자신의 실력이 어느 정도인지 아직 감이 잡히지 않았다. 그래도 이틀이나 삼일 정도면 할 수 있을 것 같았다.
“길면 삼일, 짧으면 이틀 정도면 되지 않을까 생각중입니다.”
최기훈이 어이가 없다는 표정으로 승호를 보았다.
“뭐, 삼 일?”
당황한 승호는 순간 멈칫 거렸다.
‘일주일 밖에 남지 않았는데 일정을 너무 길게 잡았나? 분명 시내씨 말로는 기간이 촉박하다고 했는데. 그러면······.’
생각을 마친 승호가 말을 이었다.
“원래는 더 오래 걸리는 일이지만, 일정을 맞추기 위해 최대한 노력하면 그렇다는 말입니다. 오늘 늦게까지 하면 대충 내일 점심때쯤이면.
“뭐, 내일?”
최기훈이 입을 꾹 다물고, 승호를 노려보았다. 잠시간의 정적이 회의실을 휘감았다. 최기훈이 천천히 말을 이었다.
“OAuth2.0의 규격은 대표적으로 password credentials과 client credentials이 있네. 그 둘의 차이는 뭔가.”
“패스워드 인증은 회원 단위로 사용가능하고 클라이언트 인증은 서버 단위 인증을 위해 사용합니다. 현재 회원 단위로 검색을 제한하기 위해서는 패스워드 인증을 사용해야 합니다.
승호는 묻지도 않은 말을 줄줄이 이어 나갔다.
“그러나 최초 OAuth에 접근하기 위해서는 client credentials 방식으로 토큰을 발급 받아야 합니다. 그 토큰을 이용해 회원 가입을 한 후에, 로그인시 password credentials 방식으로 발급 받은 토큰을 이용해 서비스를 사용해야 합니다.”
다른 보안 문제를 처리 하느라, 최기훈도 자세히 알아보지 못했다. 단편 적인 지식 몇 가지만 알고 있었을 뿐이었다.
“일단은 권한도 Oauth에서 자체적으로 제공하는 scope에 넣어 처리할 생각입니다. 어차피 scope은 배열로 처리되기 때문에 여러 권한을 처리 할 수 있을 것 같습니다. 게시판 접근 권한, 검색 접근 권한 이런 식으로 말이죠.”
최기훈은 하나의 질문을 던지고, 입도 뻥긋 하지 못했다. 승호가 하는 말을 따라 잡기에도 점점 벅 차는 상황이었다.
“무, 무슨 말인지 충분히 알았어. 그러니까. 삼 일 안에 할 수 있다는 말이지?”
“네. 삼일이면 충분 합니다.”
최기훈이 입술을 꽉 깨물었다.
“자네도 사무실 분위기 느꼈겠지만, 회사 사정이 심각해. 선진에서 5억 정도 물량을 소화해 주기로 해서 준비해 왔는데 그게 무산 되게 생겼어.”
시내 소프트의 작년 매출액이 20억이었다.
5억이면 1/4.
엄청난 액수였다. 승호는 고개를 끄덕이며 최기훈의 말을 경청했다.
“지금 나온 보안 지적 사항만 총 51 가지. 그걸 처리 하는 것 만해도, 개발자들이 허덕이고 있는 상황이라. OAuth 구축은 사실 손도 대지 못하고 있었어. 겨우 spring security 프로젝트를 다운 받아서 돌려본 정도지.”
최기훈의 말에 승호가 입술을 달싹 거렸다. 최기훈이 개의치 않고 말을 이었다.
“사실 아직 잘 모르겠어. 자네가 정말 할 수 있을지 없을지. 자네도 알겠지만··· 사고 당하기 전 자네 실력이 그리 좋은 편은 아니었잖아. 뭐, 어쨌든 지금은 지푸라기라도 잡아야 하니. 최선을 다해주게.”
최기훈의 말이 끝났다고 생각한 승호가 조심스럽게 말했다.
“그런데 드릴 말씀이 한 가지 있습니다.”
“뭐든 말해봐. 최대한 지원해 줄 테니까.”
“결국 목표는 보안 지적 사항을 해결 하는 거잖아요.”
“그렇지.”
“OAuth 서버를 구축하는 것도 중요하지만 지적 받은 51가지 문제를 처리 하는 것도 그에 못지않게 중요하다고 생각합니다.”
“맞아. 그것들은 나를 비롯한 다른 개발자들이 병렬 적으로 처리 하고 있어. 아직 다섯 건 밖에 처리 못했지만 서서히 속도가 붙을 거야.”
“오늘 보니까 3건이 더 처리 돼서 올라 왔더라고요.”
최기훈의 얼굴에 처음으로 화색이 돌았다. 옆에 앉아 있던 황시내의 얼굴도 밝아졌다.
“저녁때 까지 하면 5건은 더 처리 할 수 있을 테니까. 주말까지 야근을 계속하면 어찌 완료는 할 수 있겠어.”
“거기에 문제가 있다면요.”
“응?”
“처리 하신 8건 중에 4건에 문제가 있는 것 같습니다.”
최기훈의 인상이 팍 찡그려 졌다.
문제.
버그.
이슈.
세상 모든 개발자들이 듣기 싫어하는 말이었다.
“자네 지금 무슨 말을 하는 거야. 문제?”
“점심시간에 잠깐 코드를 살펴봤더니, 추후 문제 소지가 보여서요.”
황시내가 승호의 옷자락을 잡아 당겼다. 그리고 조용히 속삭였다.
“아까 밥 먹고 와서 20분 정도 본걸 말하는 거예요?”
승호가 살짝 고개를 끄덕였다. 최기훈의 목소리가 한층 높아졌다.
“뭐, 20분?”
급격히 얼어붙은 분위기에 승호가 멈칫 거렸다. 최기훈의 코에서 뜨거운 바람이 흘러나왔다.
“겨우 20분 동안 8건의 처리 사항을 확인했고, 4건의 문제점을 찾았다고?”
“좀 더 시간이 있었으면 더 자세히 봤을 텐데··· OAuth를 확인 하느라. 중요한 건 그게 아니고. 만약 문제의 소지가 있는 걸 그대로 들고 갔다가는 계약이 무산 될까 걱정이 됩니다.”
최기훈이 최대한 분을 억누르며 씹어 삼키듯 말했다.
“만약 아니라면 옷 벗을 각오해야 할 거야. 지금은 일 분 일 초가 중요한 시기니까. 자네 말을 듣고 있는 지금 이 시간이 얼마나 중요한 시간인지 알아 두라는 말이야.”
“그러면 빠르게 말씀 드리겠습니다. 먼저 XSS 공격에 대한 지적 사항에 대한 조치 말인데요.”
승호는 말 했고, 최기훈은 들었다. 방금 전 벌어졌던 상황이 그대로 반복되었다.
***
회의실 문을 연 최기훈이 버럭 소리를 질렀다.
“문 대리, 들어 와봐.”
보안 지적 사항을 처리하고 있던 문호경 대리가 고개를 돌리며 말했다.
“팀장님, 지금 이건부터 처리해야 하는데··· 바쁜 거 아니면 나중에 말하면 안 될까요.”
“임마, 그것 때문에 그래. 빨리 와봐.”
문호경이 미간을 찌푸리며 회의실로 들어왔다. 회의실에는 사고를 당했다는 승호, 사원인 황시내가 앉아 있었다. 문호경이 한 숨을 푹 내쉬며 말했다.
“설마 여기 얘들한테 내용 설명하라는 건 아니죠?”
“어서 앉기나 해. 그리고 설명은 네가 하는 게 아니라 들어야 돼.”
“네?”
최기훈이 승호에게 눈짓했다. 승호가 빔이 연결된 노트북을 보며 말했다.
“시간이 없으니 빠르게 진행하겠습니다. 문 대리님이 올리신 XSS 즉 크로스 사이트 스크립팅 방어 코드를 보면 정규 표현식으로 입력 값을 체크해서 script라는 문자열이 있으면 에러를 리턴 하는 방식인데요.”
“그, 그래서?”
“XSS에는 script 태그를 사용하여 시스템 권한을 탈취 하거나, 사용자 정보를 해킹하는 방법만 있는 게 아니라 ifram 태그를 삽입해서 특정 프로그램을 다운로드 받게 하거나 object 태그를 넣어 인터넷 상의 특정 프로그램을 실행하게 만들 수 있습니다. 그래서 입력 값에 대해서는 어떠한 html 태그도 넣을 수 없게 필터링을 거는 방법으로 진행해야 합니다.”
“뭐, 뭐?”
의문을 표하는 문호경을 보며 최기훈이 빠르게 말을 이었다.
“들었지? 들었으면 어서 나가서 수정해. 그리고 남 과장 들어오라고 해.”
순식간에 벌어진 일이었다. 문호경은 아무런 말 도 하지 못하고 중얼 거렸다.
“지금 무, 무슨 말씀을 하시는 건지 이해 가 잘······.”
“간단히 말해서 네가 올린 코드에 문제가 있고, 그걸 수정할 방향을 제시한 거다. 알아 들었으면 나가서 수정해. 그리고 남 과장 들어오라 해. 시간 없다. 어서!”
최기훈의 호통에 문호경이 슬금슬금 회의실을 나갔다.
남준우 과장은 들어오자마자 자리에 앉았다. 기다렸다는 듯 승호가 노트북 화면에 남준우가 올린 코드를 보여 주며 말했다.
“남 과장님이 수정하신 건 sql 인젝션 방어 코드입니다. 보시다 시피 방어를 위해 sql 문자열을 그대로 사용하는 것이 아니라, 미리 형식을 지정한 입력 값을 받도록 코드를 수정하셨어요.”
남준우의 반응도 방금 전 문호경과 크게 다르지 않았다.
“그, 그랬지.”
“그런데 이렇게 되면 몇 가지 놓치는 것들이 있습니다. 바로 여기처럼 요.”
승호가 화면에 검색 서버 쪽 코드를 띄웠다.
“최대한 수정하신다고 하셨지만 아직 수정이 안 된 부분이 있었습니다. 여기에 delete from user 이런 식의 sql 문을 넣으면 해당 테이블이 전부 삭제 될 겁니다. 그래서 이번 기회에 spring jpa 도입을 건의 드립니다. 꼭 네이티브 쿼리를 사용해야 한다면 별도의 서비스 클래스를 만들어 그곳에서만 쿼리가 실행 되도록 해야 이렇게 빠지는 부분이 없을 겁니다.”
“이제 6일 밖에 남지 않았는데 spring jpa 도입은 무리······.”
순간 최기훈이 쌍심지를 켜고 남준우를 보았다. 남준우가 꿀꺽 마른 침을 삼켰다.
“분명히 잘 처리 했다고, 이 건은 클리어 됐다고 한 게 누구지?”
남준우의 목이 움츠려 들었다.
“티, 팀장님······.”
“내가 그래서 처음부터 JPA 사용하자고 했잖아. 그냥 네이티브 쿼리 사용하는 게 편하다고, 자네가 건의해서 진행 한 건데 끝까지 책임을 져야 할 것 아냐.”
끙.
남준우는 앓는 소리를 낼 뿐 아무런 변명도 하지 못했다.
“알아 들었으면 나가봐.”
남준우가 회의실을 나가고, 두 명의 직원이 더 똥 씹은 표정으로 회의실을 들어왔다 나가고 나서야 상황은 종료 되었다.