Repository navigation
정리: 사람이 정하는 비밀번호에 공통 규칙과 SASLprep 정규화를 걸고, 로그인 본문을 64 KiB로 제한한다 - #52
Merged
Merged
Conversation
…로 제한한다
왜(회원 공통 수치 2026-10-18 결정 1·2): 비밀번호 규칙이 셀프서비스의 임시 "10자 이상"뿐이었고, 계정 생성·
관리자 생성·REST/CLI 비밀번호 변경에는 아무 규칙이 없었다. 정규화도 없어서 같은 비밀번호를 다른 유니코드
표기로 넣으면 로그인이 갈렸다.
- core `checkPasswordPolicy`(정본): 8자 이상, 영소문자·영대문자·숫자·그 밖의 문자(공백·한글 포함) 4종 가운데
3종 이상. 최대 길이 없음. 계정 생성·`account-password-set`·셀프서비스 변경·관리자 생성/변경이 모두 본다.
기존 비밀번호는 막지 않는다. 서버가 만드는 앱 비밀번호·토큰에는 쓰지 않는다.
- core `saslprep`(RFC 4013): 다른 서비스는 NFC지만 SCRAM-SHA-256이 SASLprep을 요구해 ionosphere만 예외다(결정 2).
해시와 SCRAM 키를 만들기 전에 정규화한다. 정규화 전 원문으로 만든 기존 해시는 로그인할 때 원문으로도 확인하고,
맞으면 정규화한 값으로 다시 저장한다(메일 프로토콜·셀프서비스·관리 콘솔 세 경로, 조건부 UPDATE).
근사 두 가지(미할당 판정은 현재 엔진의 \p{Cn}, 양방향의 L은 \p{L} 기준)는 주석에 적었다 — ASCII는 영향 없음.
- 로그인·MFA·비밀번호 변경 요청 본문 상한 64 KiB(`MAX_LOGIN_BODY_BYTES`). 비밀번호 길이 제한 대신
해시 부담 공격을 막는다. 나머지 관리 API는 1 MiB 그대로.
- 테스트 비밀번호 중 명령으로 설정하던 약한 값들을 규칙에 맞게 바꿨다(동작 변화 없음).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…칙 리뷰 반영) 왜(리뷰 MEDIUM 2건): - saslprep.ts의 정규식 세 개에 NBSP·ZWSP·RLM·이형 선택자·히브리·아랍 문자가 리터럴로 들어가 있었다(파일을 쓰는 과정에서 \u escape가 실제 문자로 바뀌었다). diff·터미널에서는 빈칸으로 보이거나 범위가 뒤집혀 보여 리뷰어가 무엇이 들어 있는지 확인할 수 없다. 모두 ASCII escape로 바꿨다. 같은 사고가 테스트 3개에도 있어 함께 고쳤다. 린터 4번 규칙(리터럴 제어문자)을 공백류·서식(Cf)·방향 제어·이형 선택자까지 넓혔다. 기존 소스에 걸린 것은 주석 이모지 뒤의 U+FE0F 셋과 주석 속 U+200B 하나였다(지움 / `*\/`로 바꿈). - core/scram.ts가 따로 NFKC로 "SASLprep 근사"를 하고 있어 정규화 소유자가 둘이었다. deriveScramKeys가 saslprep을 쓰게 하고 normalizePassword export와 낡은 경고 주석을 지웠다. LOW: README 예시 비밀번호를 규칙에 맞게 고침, App.createUser가 규칙을 보지 않는 테스트용 지름길임을 주석에 명시, 본문 상한 주석의 근거를 바로잡음(scrypt 비용은 길이에 거의 비례하지 않는다 — 막는 것은 정규화·파싱 부담), 비ASCII 오답은 비교가 한 번 더 든다는 것을 동시 로그인 상한 주석에, 롤백 시 정규화된 해시를 옛 코드가 못 읽는다는 주의를 OPERATIONS에 적음. 테스트: 재저장 뒤 SCRAM 키가 정규화한 값에서 나왔는지 RFC 5802 계산으로 대조, 관리자·셀프서비스 재저장, 64 KiB 초과 로그인 본문 413. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
mack-erel
force-pushed
the
password-policy
branch
from
October 19, 2026 01:39
f900e50 to
7562088
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
요약
사람이 정하는 비밀번호에 회원 공통 규칙을 걸고, 해시 전 정규화(SASLprep)를 넣고, 로그인 요청 본문을 64 KiB로 제한합니다. 회원 공통 수치 반영 계획의 P2입니다. 마이그레이션은 없습니다.
왜
바뀐 것
core/password-policy.ts, 공통 수치 결정 1)account-create,account-password-set(셀프서비스도 이 명령을 거칩니다),admin-user-create,admin-user-password-set. REST·CLI·콘솔 세 표면이 모두 이 명령을 부릅니다.core/saslprep.ts, RFC 4013, 공통 수치 결정 2)saslprep.ts하나이고, 예전에scram.ts에서 하던 NFKC 근사는 지웠습니다.\p{Cn}을 쓰고, 양방향 규칙의 L 문자는\p{L}로 봅니다. ASCII 비밀번호는 영향을 받지 않습니다.MAX_LOGIN_BODY_BYTES)까지만 받습니다. 나머지 관리 API는 1 MiB 그대로입니다.검증
npm run verify통과: 테스트 2744개.배포 영향
🤖 Generated with Claude Code