최근 보안 분야가 중요시 되고 있는 것이 사실이고, 그에 대한 합당한 이유가 있지만, 나는 개인적으로 "보안"이라는 분야에 큰 매력을 느끼지 못한다. "보안"이라는 분야는 아무리 잘해야 "제로 섬 게임(Zero-sum game)"이고, 대개의 경우는 "네거티브 섬 게임(Negative-sum game)"이 될수 밖에 없는 분야이기 때문이다. 특정 시스템을 기준으로 봤을 때, 해커들의 행위는 어디서나 "네거티브(Negative)"요소일 수 밖에 없다. 보안 전문가가 그 해커들을 아무리 잘 막는다고 해도 그 자체만으로 뭔가 이득(positive)이 생기지 않기 때문에, 결국 보안의 최선은 "제로 섬"이 되는 것이다. 물론 보호하는 정보의 가치와, 누출됐을 때의 손실을 감안해 보안 비용을 산정하지만, 어떤 이유를 들더라도 전체적으로 "제로 섬" 이상이 될 수 없다는 사실은 변하지 않는다.
하지만 현실적으로 "세상은 결코 안전하지 않기 때문에" 어쩔수 없이 보안에 손을 댈 수 밖에 없는 것이 나와 같은 개발자의 처지이다. 이번 포스팅에는 모든 보안의 기초가 될 수 있는 "사용자 패스워드 만드는 법"에 대해 다루고자 한다.
일반적으로 보안을 중시하는 제품에서는 사용자 암호를 반드시 강력한 암호 체계에 맞춰 만들도록 강제하는데, 강력한 암호 체계란 아래 항목을 모두 만족시키는 것을 말한다.
- 8~16 글자로 구성된 문자열 - 다음 네 종류의 문자 중 세 가지 이상이 동시에 사용된 문자열 :: 대문자 (A B C ...... Z) :: 소문자 (a b c ...... z) :: 숫자 (1 2 3 4 5 6 7 8 9 0) :: 기호 (` ~ ! @ # $ % ^ & * ( ) _ + - = { } | [ ] \ : " ; ' < > ? , . /) - 일반적인 단어 또는 유사한 단어 사용 금지 - 사용자 이름 또는 유사한 이름 사용 금지
"P@ssw0rd"라는 암호를 예로 들어보자. 이 암호는 8~16글자 범위 안에 구성되어 있으며, 대문자∙소문자∙숫자가 혼재되어 강력한 암호 체계를 만족한다. 물론 "Password"라는 단어를 쉽게 연상시킬 수 있는 조합이기 때문에 "매우 적절"하다는 평을 하기에는 무리가 있으나, 어디까지나 여기서는 '예제'로 만든 것이니 만큼, 논외로 하기로 한다.
이런 내용은 이미 다수의 업체나 조직에서 제시한 바 있으며, 여러 제품에도 이미 강제적으로 포함되어 있는 규칙이기도 하다. 하지만 새로운 제품을 만들어내야 하는 나의 입장에서는 반복적으로 확인하며 적용할 사항이기에 다시 한번 정리해본다.