<input type="password" maxlength="20"> is considered harmful, and why I couldn't login into Vanguard
비밀번호 입력란의 maxlength="20" 때문에 Vanguard에 로그인하지 못한 이유
Vanguard의 비밀번호 재설정 입력란은 20자를 넘으면 붙여넣은 비밀번호를 조용히 잘랐지만, 로그인 화면은 전체 문자열을 받았습니다. 입력란의 길이 제한보다 재설정·로그인 과정에서 검증 규칙을 일치시키고, 서버에서도 사용자가 보낸 값을 기준으로 검사하는 일이 중요합니다.
- 주제
AI 요약
Vanguard 웹 계정에 로그인하지 못하던 글쓴이는 비밀번호를 여러 번 재설정하고도 원인을 찾지 못했습니다. 비밀번호 관리자인 1Password가 만든 20자 넘는 비밀번호를 재설정 화면에 붙여넣으면, 입력란의 maxlength="20" 설정 때문에 Chrome이 뒤쪽 문자를 잘랐습니다. 글쓴이는 잘린 값이 저장된 줄 모르고, 이후 로그인 화면에 원래 비밀번호 전체를 넣어 인증에 실패했습니다.
입력 길이 제한이 만든 불일치
문제는 재설정 화면과 로그인 화면이 서로 다른 길이 규칙을 적용했다는 점입니다. 글쓴이는 비밀번호 입력란에서 maxlength를 쓰지 말고 JavaScript나 백엔드에서 길이를 검사하자고 제안합니다. 다만 Reddit 댓글에서는 maxlength 자체보다 두 화면의 검증 규칙이 다른 점이 원인이라는 반론도 나왔습니다. 입력값을 잘라 저장하지 말고, 길이 제한이 필요하다면 사용자에게 오류를 알리면서 서버에서도 같은 기준으로 검사해야 합니다.
댓글에서 나온 사례와 쟁점
- @u/rangoric — 비밀번호 입력란은 입력할 때만 길이를 제한하고, 새 비밀번호를 만들 때는 제한하지 않는 경우가 정말 답답합니다.
- @u/lenswipe — 더 심한 경우는 비밀번호를 설정할 때 조용히 잘려서, 결국 쓸 수 없는 비밀번호가 만들어집니다.
- @u/yawaramin — OWASP 지침을 떠올리세요. 비밀번호에 특정 문자 규칙을 두면 오히려 약해질 수 있습니다. 유니코드와 공백을 포함한 모든 문자를 허용하고, 대소문자나 숫자, 특수문자 조합을 강제하지 않아야 합니다.
- @u/LookAtTheHat — 비밀번호 길이 제한은 해시 계산에 큰 입력을 넣어 공격하는 일을 막는 데 쓰입니다. 다만 20자는 너무 짧습니다.
- @u/oneeyedziggy — 현실적인 최대 길이는 필요합니다. 생성·로그인 등 모든 과정에서 같은 기준을 써야 하고, 서버에서도 검증해야 합니다. 사용자에게 오류를 보여주는 일은 클라이언트에서 처리하면 됩니다.
- @u/iamapizza —
maxlength가 없으면 백엔드에 서비스 거부 공격이 들어올 수 있습니다. 프런트엔드와 백엔드 모두 검증하고, 무엇보다 흐름을 제대로 테스트해야 합니다. - @u/drtasty — Vanguard에서 1년 넘게 같은 문제를 겪어 모바일 앱으로 로그인했습니다. 회사가 뭔가 잘못 처리한다고 생각했는데 원인을 알게 됐습니다.
- @u/RackemFrackem — 글이 형편없이 쓰였습니다. 트윗 한 편이면 될 내용입니다.
원문: Reddit / 번역·요약: Trawling