비밀번호가 포함된 링크의 보안 — 클릭 시 발생하는 일
단축 링크에 비밀번호를 추가할 수 있습니다. 우리는 전문 용어 없이 내부에서 어떤 일이 일어나는지, 그리고 왜 그럴 만한 가치가 있는지 보여드립니다.
비밀번호가 포함된 링크에 관한 가이드의 절반은 이것이 "추가적인 보안 계층"이라는 문장으로 시작합니다. 그리고 거기서 끝납니다. 제 생각에 이것은 이 주제에 대해 말할 수 있는 가장 덜 중요한 내용입니다.
"보안 계층"이라는 말은 아무것도 설명해주지 않기 때문입니다. 이 비밀번호가 어떻게 처리되는지, 누가 볼 수 있는지, 혹은 언제 의미가 있는지조차 알려주지 않습니다. 그리고 이것들이 바로 "비밀번호 추가"를 클릭하기 전에 스스로에게 던져봐야 할 유일한 질문들입니다.
그럼 차례대로 하겠습니다.
링크의 비밀번호는 대문의 자물쇠와 같지 않습니다
사람들은 비밀번호가 링크를 완벽하게 차단한다고 상상합니다. 하지만 그렇지 않습니다. 비밀번호가 있는 링크의 보안은 마치 콘서트 티켓과 같습니다: 티켓을 가진 사람은 입장할 수 있습니다. 누군가에게 티켓을 양도하면, 그 사람 또한 다른 사람을 들여보낼 수 있습니다.
그것은 결함처럼 들립니다. 결함이 아닙니다. 단지 이 메커니즘이 무엇을 위한 것인지 알 필요가 있을 뿐입니다.
정말 유용하게 쓰이는 세 가지 상황:
프리미엄 고객을 위한 가격표 또는 세상에 공개되기 전의 베타 버전 문서입니다. 비밀번호가 없는 이러한 링크는 조만간 Google에 노출되거나 여러 사람의 손을 거치게 될 것입니다.
유효 기간이 포함된 콘텐츠. 금요일에만 제공되는 혜택. 참가자 전용 컨퍼런스 자료. 비밀번호는 링크를 통해 통제된 진입을 만듭니다 — 누군가 우연히 찾은 것이 아니라 당신으로부터 받았다는 것을 알 수 있게 합니다.
완전히 공개적으로 게시하지만 계속해서 상황을 파악하고 싶은 내용입니다. 링크가 퍼질 수 있습니다. 비밀번호가 없으면 어차피 아무도 들어올 수 없습니다.
그리고 이제 이 가이드에서 빠뜨리지 말았어야 할 내용입니다
양식에 비밀번호를 입력합니다. 그와 동시에 그것은 사라집니다. 말 그대로입니다. 당신이 "tajne123"을 설정했다는 사실이 버튼에서 손을 떼기도 전에 읽을 수 있는 형태로 존재하기를 멈춥니다.
데이터베이스에 무엇이 남을까요? 비밀번호는 아닙니다. 그 뒤에는 지문이 남습니다. 전문 용어로는: 해시(hash). 당신이 입력한 것과 정확히 일치할 때만 당신의 비밀번호와 일치하는 문자열입니다. 그 자체로는 아무것도 드러내지 않습니다.
중요한 일이기 때문에 솔직하게 말씀드리겠습니다: 서비스 운영자인 저는 귀하의 비밀번호를 읽을 수 있는 방법이 없습니다. 제가 친절해서가 아닙니다. 물리적으로 읽을 수 있는 내용 자체가 없기 때문입니다. 만약 누군가 데이터베이스에 침입하더라도, 가져갈 수 있는 것은 이 지문들의 더미뿐일 것입니다.
이것을 계산하는 알고리즘은 의도적으로 느립니다. "느리다"는 말이 불평처럼 들릴 수 있다는 것을 알지만, 이는 장점입니다. 데이터베이스를 훔친 사람이 단 하나의 비밀번호를 맞추기 위해 터무니없이 많은 시간을 소비해야 하도록 만드는 것이 목적입니다. 초 단위가 아니라 년 단위의 시간이 걸리는 것을 의미합니다.
반대편에서의 클릭
누군가 당신의 링크를 받고 클릭합니다. 목적지에 바로 도달하는 대신, 다음과 같은 화면을 보게 됩니다: "이 링크는 비밀번호로 보호되어 있습니다", 입력 필드, 버튼.
입력합니다. 서버는 입력된 내용과 저장된 지문을 비교합니다. 일치하나요? 24시간 동안 유효한 세션 토큰을 받습니다. 이후 24시간 동안은 아무것도 입력할 필요 없이 링크로 바로 돌아올 수 있습니다. 기억할 필요도, 번거로울 필요도 없습니다.
일치하지 않나요? 오류입니다. 동일한 IP 주소에서 5번의 오류가 발생하면 5분 동안 접속이 차단됩니다. 비밀번호를 차례대로 대입하며 공격하려는 봇은 벽에 부딪히게 될 것입니다.
여기에 그냥 없는 것
우리는 비밀번호를 평문으로 저장하지 않습니다. 어디에도 저장하지 않습니다. 심지어 오류를 찾을 때 확인하는 로그에도 저장하지 않습니다.
우리는 이메일로 비밀번호를 보내지 않습니다. 즉, 누군가 비밀번호를 잊어버린다면 제가 알 수 없기 때문에 보내드릴 수 없다는 뜻입니다. 이전과 동일한 채널을 통해 직접 보내주셔야 합니다.
그리고 우리는 비밀번호를 외부에 전달하지 않습니다. 그 어떤 분석도, 마케팅도, AB 테스트도 이 데이터에 접근하지 않습니다. (이것은 단지 여기뿐만 아니라 cutty.dev 전체에 적용되는 원칙입니다.)
차이를 만드는 두 가지 습관
첫 번째: 비밀번호를 머릿속에서 그냥 만들어내지 마세요. 회사 이름과 설립 연도를 조합하는 것은 당신을 아는 모든 이에게 좋은 선물입니다. 브라우저의 생성기를 사용하면 1초 만에 더 나은 결과물을 얻을 수 있습니다.
두 번째로 더 중요한 것: 비밀번호를 링크와 동일한 채널로 보내지 마세요. 링크를 이메일로 보냈나요? 비밀번호는 SMS로 보내세요. 또는 그 반대로 하셔도 됩니다. 핵심은 하나의 계정이 탈취되더라도 전체 정보를 가질 수 없게 만드는 것입니다.
거의 알려지지 않은 사소한 팁: 동일한 주소로 연결되지만 서로 다른 문구를 가진 여러 개의 링크를 만들 수 있습니다. 다섯 명에게 각각 별도의 링크를 통해 액세스 권한을 부여한다고 가정해 봅시다. 그중 한 명이 떠나야 하나요? 그 사람의 링크만 차단하면 나머지는 전혀 눈치채지 못합니다.
새로운 링크를 생성할 필요 없이 비밀번호를 변경할 수 있습니다. 패널에서 "Edytuj"를 선택하고 새 비밀번호를 입력하세요. 주의: 모든 활성 24시간 세션이 즉시 종료됩니다. 모든 사용자는 비밀번호를 다시 입력해야 합니다.
미리 알아두면 좋은 경계선
콘서트 티켓 이야기로 돌아가 봅시다. 비밀번호는 검색 엔진과 우연히 방문한 사람으로부터 보호해 줍니다. 하지만 비밀번호를 알고 이를 세상에 공유하기로 마음먹은 사람으로부터는 보호해주지 못합니다.
만약 당신의 시나리오가 "정확히 이 한 사람만 봐야 하고 다른 누구도 봐서는 안 된다"라면, 비밀번호만으로는 충분하지 않습니다. 여기에는 계정, 로그인, 그리고 권한 부여가 필요합니다. 차원이 다른 문제입니다.
하지만 손을 들어보세요, 실제로 이런 시나리오를 얼마나 자주 겪으시나요? 제 경험상 드문 일입니다. 압도적인 대다수의 경우에는 단순히 "길거리에 있는 누군가가 여기로 오게 하고 싶지 않다"는 것입니다. 그리고 이 문구만으로도 충분하고도 남습니다.
내부 구조가 어떻게 보이는지 확인하고 싶다면 — 링크를 생성할 때 "고급 옵션"을 펼치고 "비밀번호 추가"를 선택하세요. 나머지는 자동으로 처리됩니다.