비밀번호 해싱

손님 비밀번호를 글자 그대로 들고 있으면 표가 새는 날 계정이 통째로 열려요. 되돌릴 수 없는 값으로 바꿔 두고 맞는지만 대조하는 방식이에요.

쉽게 말하면

손님이 맡긴 열쇠를 금고에 넣어 두는 대신 파쇄기에 넣는 일이에요. 부스러기는 다시 열쇠로 못 돌려요. 그런데 같은 열쇠를 다시 넣으면 늘 똑같은 모양의 부스러기가 나와요. 그래서 손님이 다시 왔을 때 열쇠를 한 번 더 파쇄해 보고 모양이 같으면 본인이라고 판단해요. 가게에는 부스러기만 남으니, 창고를 통째로 털려도 도둑 손에 들어가는 건 열쇠가 아니라 부스러기예요.

해싱은 비밀번호를 되돌릴 수 없는 값으로 바꿔 저장하는 방식이에요. 그렇게 나온 값을 해시라고 불러요.

그래서 로그인 확인은 저장된 비밀번호를 꺼내 보는 일이 아니에요. 손님이 방금 친 값을 같은 방식으로 한 번 더 바꿔서, 저장해 둔 값과 모양이 같은지만 봐요.

그대로 들고 있는 가게
손님 표 · 아이디 · 비밀번호(친 글자 그대로) · 연락처

평소에는 아무 차이도 없어요. 로그인도 잘 되고 화면도 똑같아요. 차이는 표가 새는 그 하루에만 드러나요.

바꿔서 들고 있는 가게
손님 표 · 아이디 · 되돌릴 수 없게 바꾼 값 · 사람마다 다른 섞음값 · 연락처

표를 통째로 가져가도 그 자리에서 로그인은 안 돼요. 손님에게 비밀번호를 바꿔 달라고 알릴 시간이 생겨요.

그대로 저장하면 무엇이 벌어지나

위험을 "털리면 큰일 나요"로 말하면 아무것도 안 남아요. 실제로는 순서가 정해져 있어요. 다섯 걸음이에요.

  1. 1손님 표가 한 번 새요. 침입만이 아니에요. 실수로 공개된 백업 파일 하나, 잘못 열린 관리자 화면 하나면 충분해요.
  2. 2표에 비밀번호가 글자 그대로 있으면 그 순간 전부 열린 계정이 돼요. 따로 뚫는 과정이 없어요. 읽으면 끝이에요.
  3. 3사람은 같은 비밀번호를 여러 곳에 돌려 써요. 내 가게에서 샌 값으로 손님의 메일과 다른 쇼핑몰이 같이 열려요.
  4. 4피해 신고가 내 가게 밖에서 들어와요. 내 화면은 멀쩡한데 출처가 내 쪽이라 책임도 내 쪽이에요.
  5. 5바꿔서 저장했다면 이 사슬이 2번에서 끊겨요. 남는 건 부스러기라서, 손님에게 알리고 비밀번호를 바꾸게 할 시간이 생겨요.

갈리는 건 유출 여부가 아니에요

유출은 큰 회사에서도 나요. 사장님이 정할 수 있는 건 샌 뒤에 무슨 일이 벌어지느냐예요. 그대로 저장한 표가 새면 그날로 계정이 열리고, 바꿔서 저장한 표가 새면 시간이 남아요. 그 시간이 있어야 사고 대응 순서를 돌릴 수 있어요.

저장 방식마다 표에 무엇이 남나

저장 방식표에 실제로 남는 것표가 샜을 때
글자 그대로 저장손님이 친 값 그대로그날 전부 열려요. 손님의 다른 사이트 계정까지 위험해져요
뒤집기·치환 같은 자작 변형규칙만 알면 되돌릴 수 있는 값그 규칙은 코드에 적혀 있어요. 코드가 같이 새면 그대로 저장과 다를 게 없어요
빠른 해시(파일 검사용 종류)되돌릴 수는 없지만 아주 빠르게 만들어지는 값흔한 비밀번호는 기계가 대량으로 찍어 보다 맞혀요
사람마다 다른 값을 섞은 해시같은 비밀번호라도 손님마다 서로 다른 값미리 계산해 둔 대조표로 한꺼번에 깨는 길이 막혀요
비밀번호 전용 해시만드는 데 일부러 시간이 걸리도록 설계된 값하나 맞혀 보는 비용이 커져서 대량 추측이 수지가 안 맞아요

셋째 줄이 가장 흔한 오해예요. 해시라고 다 같지 않아요. 파일이 바뀌었는지 검사할 때 쓰는 빠른 해시는 비밀번호에 쓰면 안 돼요. 그 자리에서는 빠르다는 게 장점이 아니라 약점이에요.

확인해 보세요

가입 기능을 맡기고 "비밀번호는 해시로 저장했어요"라는 답을 들었어요. 이어서 물을 말로 가장 값이 나가는 건?

암호화와 뭐가 달라요

이 두 말이 자주 섞여 쓰여요. 한 번 갈라 두면 남의 설명을 듣기가 훨씬 쉬워져요. 암호화는 되돌리기 위한 것이고, 해싱은 되돌리지 않기 위한 것이에요.

손님 주소나 연락처는 나중에 화면에 다시 보여 줘야 하니 되돌릴 수 있어야 해요. 비밀번호는 다시 보여 줄 일이 아예 없어요. 맞는지만 판정하면 되거든요.

헷갈리는 말무슨 뜻인가비밀번호에는
암호화열쇠를 쥔 사람은 원래 내용으로 되돌릴 수 있게 바꿔 두는 것이에요안 맞아요. 열쇠가 새면 비밀번호도 같이 새요
해싱되돌릴 수 없게 바꾸는 것이에요. 같은 입력이면 늘 같은 값이 나와요이게 맞는 방식이에요
섞음값(솔트)사람마다 다른 값을 함께 섞어 결과를 서로 다르게 만드는 것이에요필수예요. 요즘 쓰는 도구는 자동으로 넣어 줘요
인코딩읽고 옮기기 편한 형태로 모양만 바꾼 것이에요. 누구나 되돌려요보호가 아니에요. 이걸 암호화라고 부르는 설명은 의심해야 해요

마지막 줄이 실제로 사고가 나는 자리예요. 모양이 낯설면 안전해 보이는데, 되돌리는 방법이 공개돼 있으면 그건 잠금이 아니라 포장이에요.

만들 때 확인할 네 가지

사장님이 코드를 열어 볼 일은 없어요. 대신 네 가지만 확인하면 이 주제의 대부분이 지켜져요.

  1. 1아예 보관하지 않는 길이 있는지 먼저 봐요. 소셜 로그인만 쓰면 비밀번호를 내 쪽에 두지 않게 돼요. 보관하지 않는 것이 가장 확실한 보관이에요.
  2. 2보관한다면 검증된 도구에 맡기게 해요. 해싱을 손으로 새로 만드는 건 이 분야에서 가장 흔한 사고 원인이에요.
  3. 3비밀번호 찾기가 "새로 정하기"인지 확인해요. 원래 값을 메일로 알려 주는 서비스는 되돌릴 수 있게 저장했다는 뜻이에요.
  4. 4기록에 비밀번호가 찍히지 않는지 봐요. 오류 기록에 가입 요청이 통째로 남으면 표는 안전해도 기록 쪽이 새요.

직접 해보기

지시문에 이 한 줄을 넣어 보세요

스튜디오에서 로그인이나 회원가입을 만들 때 아래 문장을 그대로 붙여 보세요. "비밀번호는 비밀번호 전용 해싱으로 저장하고 원래 값은 어디에도 남기지 말아 주세요. 비밀번호 찾기는 새로 정하는 방식으로 만들어 주세요." 만든 뒤에 고치는 것보다 처음에 한 줄 적는 쪽이 훨씬 싸요.

스튜디오에서 적어 보기

이런 말을 들으면 신호예요

장면 1 · 비밀번호를 잊은 손님이 문의했다

제가 원래 쓰던 비밀번호가 뭐였는지 확인해서 알려 주실 수 있나요.

여기서 알려 줄 수 있다면 그 자체가 문제 신호예요. 제대로 저장했다면 가게 주인도 손님 비밀번호를 모르는 게 정상이에요. 답은 하나예요. "비밀번호는 확인할 수 없는 형태로 보관하고 있어요. 새로 정하는 링크를 보내 드릴게요." 이 말은 부족함을 인정하는 게 아니라 손님에게 주는 신뢰 신호예요.

장면 2 · 외주 개발자가 작업 뒤에 말했다

로그인 확인이 빨라야 해서 가벼운 방식으로 처리했습니다.

비밀번호 해싱이 느린 건 부작용이 아니라 설계된 성질이에요. 손님은 로그인 한 번에 그 시간을 한 번만 쓰니 차이를 못 느껴요. 표를 훔쳐 대량으로 찍어 보는 쪽은 같은 시간을 셀 수 없이 많이 써야 하고요. 그래서 물을 말은 "어떤 방식으로 바꾸셨나요"예요. 속도가 이유라면 다른 곳부터 손봐야 해요.

이미 그대로 저장하고 있었다면

지금 바꿔도 늦지 않아요. 순서가 중요해요. 새로 들어오는 값이 바뀐 방식으로 저장되게 먼저 막고, 그다음 표에 남은 옛 값을 정리해요. 옛 값을 지우기 전에 손님에게 비밀번호를 바꿔 달라는 안내를 한 번 보내는 것까지가 한 세트예요.

자주 묻는 것

Q. 바꿔서 저장해도 결국 뚫린다던데요?
뚫린다기보다 찍어 맞히는 것이에요. 짧고 흔한 값은 기계가 순서대로 넣어 보다 맞혀요. 그래서 둘이 같이 가요. 저장은 비밀번호 전용 해싱으로 하고, 손님이 정하는 값은 비밀번호 규칙 정하기로 받쳐요. 한쪽만 하면 절반만 지킨 거예요.
Q. 사람마다 섞는 값은 비밀로 숨겨야 하나요?
아니에요. 해시 값 옆에 함께 저장하는 게 정상이에요. 숨기는 게 목적이 아니라 손님마다 결과를 다르게 만드는 게 목적이거든요. 요즘 쓰는 도구는 이 값을 자동으로 만들어 결과 문자열 안에 같이 담아요.
Q. 소셜 로그인만 쓰면 이 문서는 안 봐도 되나요?
손님 쪽 부담은 크게 줄어요. 비밀번호를 내 표에 두지 않으니까요. 다만 관리자 화면에는 따로 계정을 두는 경우가 많아요. 그 하나에도 같은 규칙이 걸려요. 그리고 2단계 인증은 로그인 방식과 상관없이 켜 두세요.
Q. 손님이 비밀번호를 바꾸면 옛 값은 어떻게 되나요?
새 값으로 덮어써요. 옛 값을 남겨 둘 이유가 없어요. 남기면 지켜야 할 것이 하나 더 느는 것뿐이에요.
Q. 손님 명단을 엑셀로 뽑을 때 비밀번호 칸도 같이 나오나요?
나오면 안 돼요. 내보내기 목록에서 그 칸은 빼는 게 원칙이에요. 바꿔 둔 값이라도 파일로 돌아다닐 이유가 없어요. 무엇까지 내보낼지는 손님 정보 다루기에서 같이 정하세요.

하나 더

손님이 "비밀번호를 잊었어요"라고 문의했어요. 제대로 만든 서비스라면 사장님이 할 수 있는 일은?

더 깊이 (안 읽어도 괜찮아요)

왜 일부러 느리게 만드나 · 비밀번호 전용 해싱에는 작업 강도를 정하는 값이 있어요. 이 값을 올리면 값 하나를 만드는 데 시간이 더 걸려요. 손님은 로그인 한 번에 그 시간을 한 번 쓰니 체감이 거의 없어요. 반대로 훔친 표를 놓고 대량으로 찍어 보는 쪽은 같은 시간을 셀 수 없이 많이 치러야 해요. 같은 지연이 한쪽에는 안 보이고 한쪽에는 벽이 되는 구조예요. 도구가 정해 둔 기본값을 그대로 쓰면 대개 충분해요.

같은 비밀번호인데 저장된 값이 다른 이유 · 손님 둘이 우연히 같은 비밀번호를 정해도 표에 남는 값은 서로 달라요. 섞는 값이 사람마다 다르기 때문이에요. 이 성질 덕분에 표를 열어 봐도 "이 둘은 같은 비밀번호를 쓰는구나"를 알 수 없어요. 미리 계산해 둔 대조표를 옆에 놓고 한 줄씩 맞춰 보는 방법도 이 지점에서 막혀요.

정답을 모르면서 정답 여부를 어떻게 아나 · 확인은 저장된 값을 되돌리지 않고 이뤄져요. 손님이 방금 친 값에 표에 적어 둔 섞음값을 다시 섞어 같은 방식으로 값을 만들고, 두 값이 같은지만 비교해요. 그래서 서버는 비밀번호를 모르는 채로 맞는지 판정할 수 있어요. 이 한 문장이 이 문서 전체의 뼈대예요.

이것만 기억하세요

  • ·비밀번호는 보관하는 게 아니라 되돌릴 수 없는 값으로 바꿔 두고 대조만 해요
  • ·표가 새는 일은 큰 회사에서도 나요. 갈리는 건 샌 뒤에 계정이 바로 열리느냐예요
  • ·해시라고 다 같지 않아요. 파일 검사용 빠른 종류 말고 비밀번호 전용 종류를 써요
  • ·원래 비밀번호를 알려 줄 수 있는 서비스는 저장 방식부터 잘못된 거예요
  • ·직접 만들지 말고 검증된 도구에 맡겨요. 소셜 로그인만 쓰면 아예 보관하지 않아요
VibeCampusNew build