본문 바로가기
Certificate

SW 보안약점 진단원 합격 후기

by _Jay_ 2026. 6. 17.
반응형

원래 작년에 썼어야 했는데 게을러서 이제서야 진단원 합격 후기를 올리게 되었다. 이전부터 소프트웨어 보안약점 진단원 시험에 관심이 있긴 했는데, 제대로 공부를 시작하게 된건 작년 8월쯤이었던 것 같다. 전문연으로 3년동안 코딩을 하면서 개발 보안도 적용하고, ISMS 인증 컨설팅을 나가던 시기에 스패로우나 코드레이 같은 툴을 가지고 시큐어코딩 진단도 몇번 했던 경험이 있기 때문인지 언젠간 따야지 하고 생각을 하다 작년에 교육을 신청했다.

원래 이 시험은 소프트웨어 개발 경력 6년이나 취약점 분석 경력이 3년 이상 있어야 하기에 어느 정도 진입 장벽이 있다. 하지만 문제는 교육 신청 인원을 1년에 500명 정도 밖에 선발하지 않아서, 교육 신청 날에 접수 페이지에 들어가서 티켓팅하듯 빠르게 클릭해야지 교육을 들을 수 있다는 것이다. 나도 작년 1회차 때 순서를 놓치고 3회차에 결국 티켓팅에 성공하여 교육을 수강할 기회를 얻게 되었다.

사실 교육 자체는 크게 무리 없는 선에서 이해가 가능하며, 개발을 조금이라도 한 사람들은 어렵지 않다고 느낄 것이다. 하지만 교육 수강은 차치하더라도 괴랄한 시험 난이도 때문에 정작 자격증을 취득한 사람은 수료 인원의 3%가 안되는데(물론 시험을 보지 않는 사람도 있음), 이 시험이 합격하기가 얼마나 어려운지는 아래의 진단원 자격취득 현황을 보면 알 수 있다. 보안 자격증 중에서는 개인정보영향평가(PIA)가 제일 합격률이 낮은 것으로 알고 있는데 그 다음이 아닐까 싶을 정도의 합격률이다.

 

소프트웨어 개발보안 교육 및 진단원 자격취득 현황(국가정보보호백서)

 

 

진단원 시험은 1교시 객관식 문제 40%, 2교시 주관식 문제 60%의 비율이며, 특이하게도 1교시, 2교시 시험에서 하나라도 60점 미만이면 과락이다. 여기서 1교시, 2교시의 평균을 가중치대로 내서 평균 70점 이상이 되어야 합격이기 때문에 2교시가 60점(100점 환산 시 36점) 미만이면 1교시에서 고득점을 취득하더라도 불합격이다. 나의 경우는 2교시에서 높은 점수를 얻진 못했지만 한번만에 합격했기 때문에, 공부 방법에 대해서는 어느 정도 확신을 가지고 말할 수 있어서 해당 부분도 조금이나마 이야기해보겠다.

 

1교시에는 두 문제를 틀렸고, 2교시에는 꽤나 많이 틀렸던 것 같다

 

참고로 25년도 이전에는 1교시 시험 문제에 O/X 문제와 단답형 형태가 섞여 있던 것과 달리, 작년부터 100% 객관식으로 변경되어 30문제가 출제된다. 그리고 교육 수료 후에 세번의 시험 기회가 주어졌는데, 작년부터 시험을 볼 수 있는 기회가 두번으로 바꼈다. 그렇기 때문에 시험 공부를 하게 된다면 적어도 다시 교육을 들어야하는 불상사가 없도록 한두번만에 합격하겠다는 마인드로 임하는 것이 정신 건강에 좋다.

 

우선 시험을 위해서 봐야하는 가이드는 소프트웨어 보안약점 진단 가이드로, 일단 여기서 90% 이상 시험 문제가 나온다고 보면 된다. 나머지는 10%는 개발 보안 가이드나 Python, 자바스크립트 시큐어코딩 가이드 또는 보안에 대한 용어 문제인데 그 마저도 보안약점 진단 가이드와 관련된 부분들이 나온다. 가이드에서는 크게 설계단계와 구현단계로 구분하여 설명하고 있는데, 각각 외워야 할 포인트들이 조금씩 다르다.

설계단계의 경우 20개 항목들이 있으며 여기서 외워야 하는 것은 각 항목의 보안대책들이다. 이는 1교시의 객관식으로도 나올 수 있고 2교시의 서술형으로도 나올 수 있기 때문에 기본적으로 외우고 있어야 한다. 특히 각 항목들의 보안대책을 섞어두고 나머지 한 가지가 다른 것을 고르라는 문제가 단골로 출제되기 때문에 일단을 숙지하고 있자. 실제 문제를 유출하면 안되기 때문에 가이드에서 나온 지문들로 문제를 만들어보자면 아래와 같이 낼 수 있다.

문제) 설계단계의 보안기능 입력값 검증 항목에 대한 설계 시 고려사항으로 옳지 않은 것은?

 

1. 상태정보나 인증, 인가, 권한에 관련된 중요정보는 서버 측의 세션이나 DB에 저장해서 사용하도록 설계한다.
2. 쿠키값, 환경변수, 파라미터 등 외부 입력값이 보안기능을 수행하는 함수의 인자로 사용되는 경우, 입력값에 대한 검증작업을 수행한 뒤 제한적으로 사용해야 한다.
3. 서버 프로그램 안에서 Shell을 생성하여 명령어를 실행해야 하는 경우 외부입력값에 의해 악의적인 명령어가 실행되지 않도록 해야 한다.
4. 중요정보가 포함되는 쿠키는 암호화하여 전송하거나 HMAC(Hash-based Message Authentication Code)과 같은 메시지인증코드를 이용하여 서버측에서 무결성을 검증한다.

위의 답은 3번이며 이는 시스템 자원 접근 및 명령어 수행 입력값 검증 항목의 설계 시 고려사항이다. 이렇게 다른 설계 보안대책을 끼워두거나 지문 자체를 교묘하게 틀리게 만들어서 내는 방식으로 문제를 출제할 수 있기에 각 항목의 보안대책은 바로 생각날 수 있도록 암기해두는 것이 필요하다. 또한 설계단계 각 항목에 취약점 사례로 나오는 것도 문제로 내기 좋기에 눈에 익혀두는 것을 추천한다.

구현단계는 총 49가지 항목이 있으며, 우리에게 제일 익숙한 SQL 인젝션부터 코딩을 하면 빠질 수 없는 예외처리까지 다양한 보안약점들이 존재한다. 49개를 모두 외우기는 힘들겠지만, 구현 부분이기 때문에 취약한 코드 사례와 함께 2교시 서술형에 정오탐을 구분하는 문제들이 단골로 나오므로 해당 코드가 왜 취약한지와 어떤식으로 바꿔야 안전한 코드인지도 함께 알고 있어야 한다. 만약 1교시 객관식으로 나온다면 코드를 주고 어떤 보안약점인지 묻는 문제가 나올 수 있다.

 

설계단계 기준에 연관된 구현단계 보안약점(소프트웨어 보안약점 진단가이드, 2023)

 

 

그리고 한 가지 더 외워야 하는 것은 설계단계 항목과 구현단계 보안약점과의 관계인데, 위 이미지처럼 보안약점 진단가이드에 나오는 맵핑 부분을 반드시 외우고 있어야 한다. 객관식으로 출제되는 것은 물론이고, 과거에 코드를 주고 이와 관련된  구현단계 보안약점명과 설계단계 항목명을 적는 문제로 나오기도 했다. 만약 이에 대한 문제가 나온다면 아래와 같이 출제될 수 있다.

문제) 보안기능 입력값 검증 설계 항목에서 연관된 구현단계 보안약점 항목이 아닌 것은?

 

1. 보안 기능 결정에 사용되는 부적절한 입력값
2. 포맷 스트링
3. 정수형 오버플로우
4. Null Pointer 역참조

여기서 정답은 2번인 포맷스트링인데, 허용된 범위내 메모리 접근 설계 항목에서 메모리 버퍼 오버플로우가 있기 때문에 3번도 맞지 않을까하고 헷갈릴 수 있다. 어렵게 나온다면 구현단계에서 헷갈리거나 중복되는 항목을 넣어놓고 출제할 수 있을 것이다. 사실 실무에서는 저렇게 구분하는 것이 크게 의미는 없지만, 그래도 합격자를 걸러내기 위한 시험이기 때문에 어쩔 수 없이 외워야 한다. 참고로 1교시의 문제 배점은 3~4점이다.

2교시에서는 간단한 함수명이나 보안 용어(웹쉘, 권한상승, 전자서명 등)의 설명을 주고 빈칸을 채우는 것부터, 코드를 주고 보안약점과 왜 취약한지 이유를 쓰는 문제와, 코드에서 정오탐을 구분하고 왜 그런가에 대한 설명을 하는 문제들이 주를 이룬다. 각 회차마다 문제 유형 비중이 조금씩 다른걸로 보이지만 그래도 전체적은 구성을 놓고 보면, 단답형(10~20%), 코드 설명 문제(30~40%), 정오탐 분류 문제(30~40%)로 구분할 수 있다.

그리고 보안약점 진단가이드 맨 뒤에 나오는 요구사항 또는 아키텍처 정의서를 주고 빈칸을 채우는 보고서형 문제도 한두문제 정도 출제되기 때문에 시간이 된다면 자세히 봐두는 것을 추천한다. 물론 앞에서 외운 설계단계 항목의 보안대책과 많은 부분이 중복된다. 일반적으로 2교시 문제 배점은 단답형(3~4점) 코드가 주어진 경우 해당하는 구현단계 보안약점명(1~2점), 문제가 발생하는 코드와 원인(5~6점), 해결 방안 및 코드 수정(5~6점)으로 구성된다.

결국 이렇게 따지고 보면 1교시에서는 한두문제 정도를 틀려 최대한 고득점을 얻고, 2교시에서는 방어적으로 60점 중후반을 받아서 평균 70점을 받는 것이 좋은 전략이 아닐까 생각된다. 물론 1~2점 차이로 떨어지는 사람들이 있겠지만 구현단계의 모든 코드를 외울 수 없기도 하고, 자바나 C 언어가 가장 많이 출제되지만 C#이나 파이썬도 출제될 수 있기 때문에 전략적으로 암기할 건 암기하고 포기할 것은 포기해야한다.

해당 자격증을 취득하면 되면 감리 사업이나 보안컨설팅에서 시큐어코딩 진단을 할때 수월하게 진행할 수 있으며, 진단 인력의 전문성도 어필할 수 있다. 나의 경우 감리사와 함께 진단원 자격증도 우선순위로 두고 있었기 때문에 길게 끌지 않고 빠르게 취득할 수 있었는데, 위에서 설명한 공부방법이 유효하게 먹혀들었던 것 같다. 최근에는 진단원 강의도 생겨나고 있어서 도움을 받기 쉬워졌는데, 강의도 좋지만 문제를 많이 풀어보는 것을 추천한다. 그럼 이 글을 읽는 분들 모두 빠른 자격증 취득을 기원하며 후기를 마치도록 하겠다.

반응형

댓글