소프트웨어 보안과 시큐어 코딩, 도둑이 들기 전에 문을 잘 만드는 법

비밀번호를 적은 쪽지를 책상에 붙여 두면
학교에서 사물함 비밀번호를 까먹을까 봐, 그 번호를 종이에 적어 사물함 문에 떡 붙여 둔 친구를 본 적 있나요? 자물쇠는 분명 있는데, 비밀번호가 누구에게나 보이니 자물쇠는 있으나 마나예요. 컴퓨터 프로그램도 똑같아요. 겉보기엔 멀쩡히 돌아가는데, 안을 들여다보면 이렇게 '문은 달아 놓고 열쇠는 꽂아 둔' 허술한 구석이 숨어 있곤 해요. 소프트웨어 보안은 바로 이 숨은 틈을 찾아 막는 이야기예요.

시큐어 코딩은 집을 지을 때부터 자물쇠를 다는 일
흔히 보안이라고 하면, 다 지어진 프로그램에 백신을 깔거나 방화벽을 세우는 모습을 떠올려요. 그런데 시큐어 코딩은 그보다 한참 앞 단계예요. 집을 다 짓고 나서 창문에 쇠창살을 덧대는 게 아니라, 설계도를 그릴 때부터 '여기 창문은 너무 낮아서 누가 넘어오겠는데' 하고 미리 막는 거예요. 프로그램을 만드는 사람이 코드를 쓰는 그 순간에, 나쁜 사람이 파고들 틈이 안 생기도록 조심해서 쓰는 방법, 그게 시큐어 코딩이에요. 영어 단어 시큐어는 '안전한'이라는 뜻이고, 코딩은 프로그램을 만드는 일이니, 말 그대로 '안전하게 만들기'인 셈이죠.

가장 흔한 사고는 손님이 건넨 쪽지를 그대로 믿을 때
프로그램은 보통 사람에게 무언가를 입력받아요. 검색창에 단어를 치고, 로그인 칸에 아이디를 넣죠. 문제는 프로그램이 이 입력을 너무 순진하게 믿을 때 생겨요.
식당에서 손님이 '주방장에게 전해 주세요' 하며 쪽지를 건넸는데, 종업원이 내용도 안 보고 그대로 주방에 가져갔다고 해 봐요. 그 쪽지에 '냉장고를 통째로 손님께 드리시오'라고 적혀 있어도 주방장이 그대로 따른다면 큰일이죠. 컴퓨터에서도 입력 칸에 평범한 단어 대신 명령어를 슬쩍 적어 넣어, 프로그램이 그걸 명령으로 착각하고 따르게 만드는 공격이 있어요. 그래서 시큐어 코딩에서는 사용자가 넣은 값을 그대로 믿지 말고, '이게 진짜 이름이 맞나, 이상한 명령이 섞이진 않았나' 하고 한 번 걸러서 받아요. 이걸 입력값 검증이라고 불러요. 보안 사고의 상당수가 바로 이 검증을 빠뜨려서 일어나요.

그릇보다 많이 담으면 넘쳐흐른다
또 하나 자주 나오는 말이 버퍼 오버플로우예요. 이름은 어려운데 장면은 쉬워요. 한 컵에 담을 수 있는 물은 정해져 있는데, 거기에 두 배 세 배를 들이부으면 어떻게 되나요? 물이 책상으로 흘러넘쳐 옆에 둔 다른 물건을 적시죠.
프로그램도 글자나 숫자를 담아 두는 작은 그릇을 미리 정해 둬요. 그런데 정해진 크기보다 더 많은 양을 욱여넣으면, 넘친 데이터가 옆자리에 있던 중요한 정보를 덮어써 버려요. 나쁜 사람은 일부러 이렇게 넘치게 만들어서, 흘러넘친 자리에 자기가 원하는 명령을 슬쩍 끼워 넣어요. 그래서 안전하게 코딩하는 사람은 '이 그릇에 정해진 만큼만 담기는지' 늘 확인해요.

왜 다 만든 뒤가 아니라 처음부터일까
이유는 단순해요. 빨리 고칠수록 싸게 끝나거든요. 옷을 만들 때 처음 바느질에서 실밥 하나를 바로잡는 건 몇 초면 되지만, 다 만들어 가게에 걸린 옷의 솔기를 뜯어 고치려면 훨씬 번거롭잖아요. 프로그램도 만드는 중에 틈을 막으면 손쉽지만, 세상에 다 내놓은 뒤에 구멍이 발견되면 이미 많은 사람이 그 프로그램을 쓰고 있어서, 고치는 데 드는 시간과 비용이 몇 배로 불어나요. 게다가 그사이 누군가의 정보가 새어 나갈 수도 있고요. 그래서 정보처리기사 시험에서도 소프트웨어를 만드는 모든 단계에서 보안을 챙기라고 가르쳐요.

정리
소프트웨어 보안과 시큐어 코딩은 거창한 기술이라기보다, '믿기 전에 한 번 확인하고, 정해진 만큼만 담는' 조심성의 습관이에요. 사용자가 넣은 값을 그대로 믿지 않고 걸러서 받고, 그릇이 넘치지 않게 살피고, 무엇보다 다 만든 뒤가 아니라 만드는 그 순간부터 틈을 막는 것. 사물함 비밀번호를 문에 붙여 두지 않는 그 작은 조심성이, 결국 수많은 사람의 정보를 지키는 큰 울타리가 된다는 걸 기억하면 돼요.