블로그에 글을 쓰는 것은 상당히 오랜만이다. 어제 다소 흥미로운 주제로 토론?을 했기 때문에 글을 적어나가면 어떨까 싶었다. 개발자라면 이미 소식을 들었지만, 이 글을 쓰는 시점으로 어제 Apache log4j 의 취약점이 대대적으로 보고되면서 여러모로 소식이 전파되었고, 정부차원에서도 보안패치를 권고한 바 있다. 아파치 소프트웨어재단 기준으로 취약점 레벨은 최고 단계로 설정되었으며 이를 이용하면 원격으로 프로그램을 실행할 수 있는 문제가 발생한다고 한다. 웹쉘(Web Shell) 같은 느낌인가 보다. 실제로 취약점 이름을 log4jShell 이라고 지은 듯. 내가 활동하는 오카방에서도 이에 대한 논의가 있었다.
나는 어차피 자바 개발자도, 보안 전문가도 아니기 때문에 이 문제에 대해 크게 논의할 생각은 없었지만 Apache log4j 가 많은 기업에서 사용하고 있는 오픈소스(Open Source)라는 점에서 토론하다가 이에 대해 다소 의견 충돌이 있었다. 오픈소스에 대한 논의는 개인적으로 많이 한 적 없지만, 이 기회에 내 생각을 블로그에 적어보기로 했다. 이 논의는 돌아가보면 생태계가 나타난 순간부터 있었던 아주 고리타분한 문제이긴 한데, 그래도 여전히 토론해볼 가치는 충분하다.
이 글은 Apache log4j 에서 발생한 취약점에 대한 논의라기보다는 오픈소스 생태계 전반에 대해 내 생각을 정리한 글이다. 취약점은 이 글의 발단이자 그저 양념일 뿐이므로 전혀 이야기하지 않는다. 만약 관련 부분이 궁금하다면 다른 사람이 쓴 글을 읽어보자.
여기서는 나의 토론 상대이자 이해할 수 없었던 사람인 '적'에 대해 '그'라고 부르도록 하자. 비록 적이었으나 내가 이 글을 쓸 수 있도록 아이디어를 제공한 장본인이기도 하니 한편으론 고마울지도?
사용자가 오픈소스를 검증하지 않았기 때문이다?
내가 도저히 이해할 수 없었던 그의 말을 인용해보면 다음과 같다.
오픈소스를 검증하지도 않고 "무지성" 으로 사용한 탓이다
'무지성' 이라는 단어 때문에 순간 욱할 뻔했지만, 이를 감정적으로 접근하지 말고 이해를 해보자면 오픈소스를 검증하고 이를 사용하는 것에 대한 책임을 사용자에게 전가하겠다는 이야기다. 실제로 오픈소스 사용으로 발생하는 문제는 사용자에게 어느 정도 책임이 있다. 오픈소스를 사용하는 개발자라면 당연히 그 정도는 인지하고 사용한다. 하지만 이 말의 내부적 의미를 살펴보면, 모든 오픈소스는 '의심'이 기반이 되어야 하며 사용자에 의한 검증을 거쳐야 한다고 해석할 수도 있다.
"개발의 기본은 의심하는 겁니다"
애초에 그의 발언을 빌리자면 개발의 기본은 의심하는 것이라고 아예 못을 박았기 때문에 이렇게 해석하는 것이 타당하다. 의심도 있어야 하는 것은 맞지만, 개발의 기본이 의심이라면 왜 오픈소스를 사용하는가? 나라면 의심병 돋아서 오픈소스는 커녕 남이 만든 소스는 하나도 사용하지 않을 듯하다.
의심을 해야 할 때도 당연히 있다. 백엔드 개발자의 입장에서 프론트엔드에서 입력되는 값을 의심하고 검증하는 것은 어찌 보면 당연한 이야기다. 근데 이걸 여기에 적용한다고? 뭔가 번짓수를 잘못 찾은 것이 아닌지 '의심'된다.
오픈소스를 왜 사용하는가?
오픈소스를 사용하는 본질적 이유는 무엇인가? 개발에 필요한 시간을 단축하고 비즈니스 로직에 집중하면서 부가적으로 사용되는 라이브러리 및 패키지에 대한 의심, 검증은 제작자에게 어느 정도 의지하는 것으로 일을 분산할 수 있기 때문이다. 우리가 오픈소스를 쓰는 것은 소스코드의 검증을 타인에게 전가하고, 모듈화하여 재사용성을 높이면서도 시간을 단축할 수 있는 이점으로 오픈소스를 사용하는 것이지 검증을 하려고 오픈소스를 쓰는 게 아니다. 주객전도가 되어서는 안 된다. 실제로 오픈소스 제작자는 의심으로 시작하여 코드에 문제가 발생하지 않도록 최선을 다하고, 이슈가 보고되면 해결하려 부단히 노력한다. 그건 오픈소스에 기여하고 프로젝트를 운영하는 나 또한 마찬가지다.
오픈소스 사용자가 검증을 필요하게 않게끔 만들어나가는 것이 오픈소스에 기여하는 이유이자 소스코드를 오픈하는 이유다. 모든 것이 다 검증되었고 '완벽'하다면 왜 소스코드를 오픈하는가? 나 같으면 소스코드 돈 받고 팔 텐데. 애초에 이 세상에는 완벽은 없고 '완벽에 가까워지는 것'만이 존재한다는 사실을 그는 알지 못하는 걸까?
프로젝트가 다수에게 인정받았고, 대중적으로 사용되는 라이브러리 또는 프레임워크라면 신뢰를 바탕으로 움직이기 때문에 오픈소스 생태계가 동작할 수 있게 된다. 이는 다수에 의해 어느 정도 검증이 되었다고 여길 수 있으며 이슈가 이를 증명한다. 이슈가 전혀 보고되지 않은 프로젝트라면 의심을 해볼 필요는 있다. 만약 내가 사용하는 모든 오픈소스를 다 검증하고 비로소 내 코드에 사용하고자 한다면 나는 오픈소스를 사용하지 않았을 것이다. 오픈소스의 코드를 하나 사용할 때마다 버그가 날까 봐 조마조마해야 한단 말인가?
아무 근거 없이 오픈소스를 사용하는 것은 당연히 문제가 있으나, 이름이 알려져 있고 깃허브 스타와 이슈 등으로 많은 이들의 손을 거쳐간 오픈소스라면 충분히 믿고 사용할 수 있다. 설령 그렇다 하더라도 버그와 오류는 있을 수 있다는 것은 분명히 인정하고 가는 것이 무엇보다 중요하다. 오픈소스에 대해 무조건적인 신뢰, 추종이나 의심은 좋지 않은 생각이다. 하지만 나 혼자 아무리 검증하고 짠 소스코드보다 다수의 인정과 검증으로 만들어진 오픈소스가 내 코드보다 더 나을 것이라고 믿는다. 적어도 그가 말했던 것처럼 '무지성'으로 사용한다고 쳐도 적어도 나 혼자 검증한 것보다는 더 나은 코드를 가지고 있을 것이다.
블록체인도...?
이 관점은 블록체인과도 연관 지어 볼 수 있는데, 특히나 비트코인과 같은 퍼블릭 블록체인의 바탕이 되는 것은 다수의 검증으로 인해 발생하는 '신뢰' 다. 다수의 목격자가 거래를 인지함으로써 부정을 방지한다. 오픈소스도 다수의 인정으로 인한 신뢰를 기반으로 움직이는데, 이를 부정하는 것은 오픈소스 생태계에 반하는 고리타분한 관점이라고 생각된다. 모든 게 의심이라면 신뢰를 기반으로 동작하는 암호화폐는 탄생할 수 없어야 했다.
암호화폐의 신뢰를 얻기 위한 합의 알고리즘은 바닥을 들춰보면 거래당사자인 각 익명의 개인에 대한 의심에서 시작되었고 그렇기에 암호화폐는 정말 많은 사람이 그 가치를 의심하고 검증을 거쳐왔지만, 결론적으로는 신뢰가 바탕이 되어 동작하게 되었다. 신뢰가 유지되기에 NFT(대체 불가 토큰)이라는 신시장까지 나오게 된 것이다.
그저 남들이 사용하니까
그는 또한 '그냥 '무지성'으로 남들이 사용하니까 사용하는 거야'라고 말했다. 그는 어째서인지 무지성이라는 말을 정말 좋아하는 듯하다. 그리고는 나보고 아래와 같은 질문을 덫붙였다.
"코더십니까?"
타인에게 코더냐고 묻는다니 로블록스에서 Lua 로 개발하는 10대 개발자들도 그런 무례한 말은 사용하지 않는다는 점을 그에게 전하고 싶다. 거울을 보고 스스로에게 질문한 것이라면 그건 인정이다.
오픈소스는 오히려 남들이 사용하니까 이 코드를 어느 정도 신뢰할 수 있다고 생각한다. 믿을 수 없다면 다 만들어라. 그럴 거면 본인이 다 만들어서 검증하고 사용할 것이지 남이 만든 운영체제, 남이 만든 언어, 남이 만든 도구를 사용하며 그런 말을 하는 것은 이해할 수 없다. 내가 사용하는 운영체제가 외부의 공격으로부터 해킹을 당할까 봐, 검증되지 않은 코드가 있을까 봐 두렵다면 직접 만들어서 쓰길 바란다. 생각해보니 예전에 어느 커뮤니티(어디인지 이름은 밝히지 않겠음)에서 본 문구가 떠오른다. 그 커뮤니티는 대표적인 꼰대 개발자들의 집합소 같은 곳인데, 아래와 같은 발언을 했다.
"인터넷이 없는 상태에서 개발하지 못한다면, 개발자가 아니다."
그는 오픈소스를 무조건적인 의심으로 몰아간 것뿐만 아니라 지금까지 아무도 검증하지 않았기 때문에 이러한 사단이 났다고 이야기했는데, 검증이 되지 않았고, 실험해보지 않았다면 이슈가 달릴 이유도, 버그가 있다는 존재도 알 수 없었을 것이다. 대중적으로 사용하는 운영체제, 애플과 마소같은 대기업에서도 이슈가 발생하고 지속적인 패치가 이루어진다. 검증은 꾸준히 이루어지고 있다. 이런데도 검증이 없었던 거라고? 말도 안 되는 소리다. 검증이 있기에 블록체인도, 오픈소스가 존재한다.
제작자만 검증했겠죠, 정작 사용자는 검증하지도 않고
설령 제일 바닥은 의심으로부터 시작되었다고는 해도 의심으로 인해 신뢰가 구축되었고, 신뢰가 바탕이 되어 움직인다는 사실에는 변함이 없다. 사용자는 오픈소스 개발자가 의심으로 인해 각종 유닛 테스트를 진행하고, 예제를 만들어 테스트했음을 알아야 한다. 이러한 일은 누가 하는가? 의심을 해소하고 검증해야 하는 것은 오픈소스 제작자들이자 기여자이지 이를 오픈소스 사용자에게 모두 전가한다는 것은 크나큰 문제가 있다. 오픈소스 사용에 검증이 필요하고 의심이 전제되어야 한다면 소스를 검증할 능력이 부족한 초심 개발자들은 오픈소스를 사용을 차라리 금지하는 것이 어떤가? 정말 바보 같은 일이다.
오픈소스 사용자인 우리는 그저 어느 정도의 책임을 감수하고 코드에 버그와 오류가 있을 수도 있다는 것을 인지하고, 만약 문제를 발견한다면 이슈를 보고하거나 직접 기여를 통해 코드를 더 나은 방향으로 고치도록 방향을 유도하면 된다. 이슈와 기여는 오픈소스의 꽃이자 이로인해 생태계가 점점 발전한다. 나는 이것이 오픈소스의 사용 이유이자 우리가 신뢰를 바탕으로 오픈소스를 사용할 수 있는 이유라고 생각한다. 만약, 개발의 기본이 의심이라는 전제를 오픈소스에 적용시키고자 한다면, '남'이 만든 오픈소스보다는 직접 만들어 사용할 것을 권한다.