Software Engineering

소프트웨어 안전과 보안: 보이지 않는 시스템의 그림자

habana4 2025. 4. 12. 23:35
반응형

반응형

어느덧 우리는 알게 모르게 수많은 소프트웨어 위에서 삶을 살고 있습니다. 스마트폰을 이용하여 친구들과 소통하고, 인터넷을 검색하고, 물건을 구매하며, 자동차를 운전하며, 병원에서 진료를 받고, 은행 업무를 처리하고 회사에서 여러가지 업무를 처리하는 과정에서 이미 복잡한 소프트웨어 시스템의 통제를 받고 있습니다. 

 

그런데 이들 소프트웨어는 실제로 사람이 볼 수 있는 형상을 가지고 있지는 않습니다. 실제로 스마트폰, 인터넷, 자동차, 병원, 은행, 그리고 회사에서 접하는 모든 소프트웨어는 이를 운영하는 기기(컴퓨터, 스마트폰, 기타 여러 단말기 등)는 눈으로 보고 만질 수 있지만 그 이면에서 동작하는 소프트웨어 그 자체는 눈으로 보거나 만질 수도 없습니다. 단지 운영 기기를 통한 소프트웨어 동작 결과를 우리들은 당연하게 받아들이고 넘어가는 것이 현실입니다. 소프트웨어 내부에서 어떤 문제점들이 쌓이고 있는지 알 수 있는 방법이 없습니다.  

 

하지만 문제는 바로 이런 지점에서 발생한다고 생각합니다. 눈에 보이지 않기 때문에, 소프트웨어의 위험도 쉽게 간과되며, 그 심각성은 종종 사고가 실제로 일어난 후에야 비로소 인식되곤 합니다. 

 

실제 요즘 같은 디지털 시대에 이러한 "디지털 사고"는 대부분 예고없이 찾아 옵니다. 시스템이 한순간 정지되거나 해킹으로 인해 기능이 마비되었을 때, 우리는 그제서야 해당 소프트웨어가 얼마나 중요한 역할을 맡고 있었는지 깨닫게 됩니다. 그 전까지는 비용 절감이나, 일정 단축과 같은 너무나도 현실적인 문제들에 밀려 뒷전으로 밀려 났다가, 비로소 사고가 발생했을때 "사후약방문"과 같은 대처를 하고 있는 것이 엄연한 현실이라고 느껴집니다.

 

개발 문화와 우선순위: 왜 안전과 보안은 뒷전이 되는가?

조직에서 바라보는 소프트웨어 개발 프로젝트는 ‘시장 적시성(Time-to-Market)’이 단연코 가장 중요한 키워드입니다. 새로운 차량을 얼마나 빠르게 시장에 출시할 수 있느냐는 기술적 역량뿐만 아니라, 조직의 생존과 직결된 비즈니스 목표로 간주됩니다. 이런 경우 기능 구현, 제품 출시 일정, 경쟁사 대응, 비용 절감 등은 단기적인 비즈니스 성과 지표가 우선순위를 장악하게 되며, 그 과정에서 안전(Safety)과 보안(Security)는 눈에 보이지 않는 비기능 요구사항으로 뒷전으로 밀려나기 쉽습니다. 이는 단순히 우연하게 벌어진 사건이 아니라, 구조적이고 반복적인 경향으로 자리잡은 현실입니다.

 

이와 같은 환경에서 경영진과 의사결정자들이 안전과 보안을 어떻게 인식하느냐는 매우 중요한 요소입니다. 많은 경우, 보안 강화나 안전 설계를 위한 활동은 즉각적인 매출 증가로 이어지지 않기 때문에, 이는 기업 입장에서 "필요하긴 하지만 당장 하지 않아도 되는 일"로 인식됩니다. 다시 말해, 비용은 들지만, 눈에 보이는 성과는 없는 일이라는 것이라고 느끼는 것입니다. 

 

최근 일어난 어떤 대화에서 있었던 대화입니다. 회사는 개발된 제품을 이용하여 인류에 더 나은 기여를 한다, 즉 Progress for Humanity를 위해 주어진 제한된 자원으로 제품을 개발을 하며 부족한 부분을 점진적으로 보완하는 의사결정이 필요하다는게 요지 입니다. 이것이 바로 우리가 직면한 인식이라는 생각이 듭니다.

 

소프트웨어의 "보이지 않는 작동"이 갖는 함정

소프트웨어는 물리적 기계와 달리 고장이나 이상을 직관적으로 감지하기 어렵습니다. 이로 인해 개발 단계에서 많은 리뷰와 검증을 해야 한다고 하지만, 여러 이유에서 뒷전으로 밀린다거나 혹은 제한적인 검증으로 인해 부분적인 확인만을 거친 채 제품이 출시되곤 합니다. 이는 하드웨어에서 처럼 고장의 징후들이 직접적으로 드러나지 않기 때문인데, 가령 예를 들어 차량에서 엔진이나 배터리에서는 고장이 발생하면(특정 조건이 다다르면) 이상한 소리가 난다거나, 덜컹거린다거나, 또는 배터리가 방전된다거나 하는 직접적인 징후가 발생하지만, 엔진을 제어하는 엔진 제어 소프트웨어와 배터리 관리 소프트웨어에서는 아무런 오류를 인식할 수 없으며, 오히려 표면적으로 멀쩡히 동작하는 것처럼 보이면서도, 그 내부에서는 심각한 오류나 취약점이 누적되고 있을 수 있습니다.

 

물론 이를 위해 수많은 소프트웨어 진단 데이터를 수집하고, 이를 다시 개발에 반영하는 등의 노력이 존재하지만 모든 문제 상황에 대한 커버리지를 확보한다고 보기엔 어려움이 있습니다.  그러나 이러한 소프트웨어의 문제는 내부에서 누적된 오류가 특정 임계치를 넘는 순간, 시스템이 갑작스럽게 정지한다거나, 사용자 자산에 치명적 피해를 야기할 수 있습니다. 이러한 "지연된 고장"은 소프트웨어 만의 고유한 위험 구조이며, 눈에 보이지 않기 때문에 경각심을 갖기 어렵고 따라서 대부분의 경고는 사후에야 의미를 갖게되는 악순환을 반복하게 됩니다.

 

보이지 않는 것을 어떻게 증명할 것인가?

최근 ISO 26262(자동차 기능안전), ISO/SAE 21434(자동차 사이버보안)와 같은 여러 안전 표준이 제시되고, 업계에서는 이를 준수하기 위해 인력을 충원하고, 교육을 받으며, 여러 인증기관을 통해 컨설팅이나 인증을 취득하고자 하는 다양한 노력을 기울이고 있습니다. 또한 설계 과정에서 이들 표준에서 제시한 다양한 방법론들을 동원하고 개발, 분석, 검증, 그리고 관리를 추진하고 있습니다.  그러나 이것만으로 모든 소프트웨에에 안전이 확보되었고, 보안에 문제가 없다고 할 수 있을까요? 

 

소프트웨어는 전자적으로 작동하며, 형체가 없는 논리 구조와 코드의 집합이기 때문에, 이 소프트웨어가 "안전하다"거나 "보안에 강력하다"는 것을 가시적으로 보여주거나 증명하는 것이 매우 어렵습니다. 설계 문서나 테스트 리포트가 존재한다 하기 때문에 괜찮지 않느냐고 반문할 수 있겠지만, 그것이 곧 소프트웨어 전체의 안전성과 보안성을 담보하지는 않습니다. 그 이유는 다음과 같습니다.

  • 모든 경우의 수를 테스트할 수 없다: 소프트웨어는 수많은 조건, 분기, 환경 변수에 따라 동작이 달라진다. 이를 전부 테스트하는 것은 현실적으로 불가능합니다.
  • 보안 위협은 동적인 존재이다: 해커나 악성 코드가 시스템을 공격하는 방식은 끊임없이 진화합니다. 현재는 안전하더라도, 미래에는 동일한 시스템이 취약해질 수 있습니다.
  • 시스템 경계가 명확하지 않다: 현대의 복합적인 시스템은 API, 네트워크, 외부 장치 등 다양한 경로로 연결되어 있으며, 이로 인해 안전과 보안을 보장하기 위한 시스템 범위 자체가 모호해집니다.

검증의 측면에서 보면, 차량용 소프트웨어 중에는 실제 환경에서 위험한 조건을 재현해 시험하는 것 자체가 불가능하거나 위험한 경우가 많습니다. 이러한 소프트웨어는 시험 중의 오류가 곧 인명 피해나 대규모 사고로 이어질 수 있기 때문에, 실제 조건에서 검증하거나 실시간 테스트를 수행하는 것이 법적·윤리적으로 제한됩니다. 또한 실제 환경을 완벽히 재현하지 못하며, 분석 도구의 한계로 인해 모든 오류나 취약점을 잡아내지 못할 가능성도 있습니다. 결과적으로 안전성과 보안성을 입증하는 것이 이론적 수준에서만 가능하거나, 완전성을 장담할 수 없는 상태로 남게 됩니다.

 

보이지 않는 안전을 증명하기 위한 논거의 힘

앞서 언급한바와 같이 소프트웨어가 눈에 보이지 않기 때문에, 그 안전성과 보안성을 사전에 명확히 증명하고 평가하는 것은 매우 어렵습니다. 실제 기능은 정상적으로 동작하더라도, 내부에 얼마나 많은 위험 요소가 숨어 있는지 직관적으로 파악하기 어렵고, 사고나 침해가 발생한 이후에야 비로서 드러나곤 합니다. 또한 검증을 통해 충분히 확인한다 하더라도 모든 경우의 수를 테스트 할 수 없기 때문에 그 역시 한계가 있습니다.  

 

따라서 우리는 이 보이지 않는 위험을 통제하고, 그 신뢰성을 확보하기 위해 논리적 증명에 기반한 접근 방식을 채택해야 합니다. 다시 말해, 소프트웨어의 안전성과 보안성이 충분히 확보되었음을 입증하기 위해, 체계적인 논거(Safety and Security Argument)를 제시하고 검증하는 활동이 반드시 필요하다는 의미입니다. 

 

소프트웨어의 안전(Safety)과 보안(Security)을 논리적으로 증명하기 위한 접근 방식은 검증 보고서나 단순한 데모만으로는 부족합니다. 수많은 조건과 상태 변화, 그리고 복잡하게 얽힌 외부 환경 속에서 모든 위험을 검증으로 확인할 수는 없기 때문입니다. 대신, 우리는 “왜 이 시스템이 안전한가?”, “어떤 이유로 이 보안 설계가 효과적인가?”를 명확한 구조로 설명하고 증명할 수 있어야 합니다. 

 

이때 사용되는 것이 바로 안전 논거(Safety Case)와 보안 논거(Security Case)다. 이는 다음과 같은 세 가지 구성 요소로 이루어집니다. 

  1. Claim (주장): 시스템이 안전하거나 보안이 잘 되어 있다는 중심 주장
  2. Evidence (증거): 설계, 테스트, 분석 결과 등 해당 주장을 뒷받침하는 객관적인 증거
  3. Argument (논거): 증거가 주장을 어떻게 지지하는지를 설명하는 논리적 연결 고리

이러한 논거 기반의 접근은 단지 기술적 검토를 넘어, 이해관계자와 사회 전체가 해당 시스템을 신뢰할 수 있는 토대가 됩니다. 예컨대 차량 제어 소프트웨어의 안전성을 설명하기 위해서는 단지 검증 결과뿐만 아니라, “모든 고장 모드가 분석되었는가?”, “센서 오작동 시 대체 경로가 확보되어 있는가?”, “설계 의도는 정확히 구현되었는가?”와 같은 질문에 대해 체계적인 논리와 증거로 답변해야 한다는 것입니다. 

 

여기서 한가지 장담할 수 있는 점은 이러한 논거 기반의 접근이 개발 과정 그 자체의 질을 향상시킬 수 있다는 점입니다. 단순히 "기능이 정상적으로 동작한다"는데서 그치지 않고, "왜 그렇게 기능이 동작되며, 무엇을 대비 하고 있는 것인가?"를 명확히 하는 과정이야 말고, 눈에 보이지 않는 소프트웨어 안전과 보안을 증명하기에 확실한 자산이 된다고 믿기 때문입니다.


마치며...

마지막으로 프로젝트 일정은 촉박하고, 인력과 자원은 제한적이며 경쟁 시장은 날로 치열해지고 있는 지금의 수많은 소프트웨어 개발 조직에서 숨겨진 안전 위험성과 보안 취약성을 모두 인식하고, 이를 최우선으로 두어야 한다는 것을 주장하기는 쉽지 않습니다. 그러나 이러한 현실을 이유로 보이지 않는 위험을 방치한다면, 그 대가는 언젠가 반드시 발생하게 됩니다. 그것도 단순한 기술적 실패가 아닌, 사람의 생명, 사회의 신뢰, 기업의 존립과 같은 치명적인 형태로 돌아올 것입니다. 

 

이러한 이유로 지금이야말로 인식의 전환이 필요한 시점이라고 생각합니다. 소프트웨어 개발은 더 이상 단순한 기능 구현의 과정이 아닙니다. 그것은 책임 있는 설계이며, 윤리적 선택이며, 사회적 신뢰와의 약속이라는 사실을 간과하지 말아야 합니다. 이러한 본질을 실천하기 위해 우리는 다음과 같은 자세를 가져야 할 것입니다.

 

첫째, 보이지 않는 것을 설명할 수 있어야 합니다. 안전과 보안이 충분히 고려되었음을 주장하는 데 그치지 않고, 논리적 근거와 구조화된 증거를 바탕으로 설득할 수 있어야 합니다.

 

둘째, 개발 초기부터 위험을 예측하고 대응하는 설계 문화를 조성해야 합니다. 위협 모델링(Threat Modeling)과 안전성 분석(Hazard Analysis)은 이제 더 이상 선택 사항이 아니라, 기본 역량이 되어야 합니다.

 

셋째, 투명한 문서화와 추적 가능한 개발 절차를 통해 설계와 검증의 모든 근거를 명확히 남겨야 합니다. 이는 향후 문제가 발생했을 때 책임과 대응의 토대가 되며, 동시에 조직의 기술 신뢰도를 높이는 수단이 됩니다.

 

"기술은 기능으로만 평가받지 말아야 한다.
기술은 그로 인해 얼마나 안전하고,
얼마나 신뢰할 수 있는지를 보여야 진정한 가치를 갖는다."

 

반응형