ComponentsP3 본문

OneTimeCodeInput

일회용 코드(OTP·PIN·복구 코드) 세그먼트 입력 — 칸별 입력, 자동 이동·붙여넣기 분배·키보드 이동. role=group + 칸 라벨, 첫 칸 one-time-code 자동완성. 값은 갭 없는 접두 문자열.

마지막 업데이트 2026-06-24

한눈에#

SMS·이메일 코드, 인증 앱 OTP, 계정 복구 코드를 칸 단위로 받는 입력입니다. 타이핑하면 다음 칸으로 자동 이동하고, 코드를 통째로 붙여넣으면 칸에 나눠 채워집니다. 값은 항상 갭 없는 문자열("123")이라 소비자는 onComplete로 완성 시점만 받으면 됩니다 — 검증은 소비자(서버) 몫, 이 컴포넌트는 입력만 합니다.

  • 칸 단위 입력
  • 자동 이동 · 붙여넣기 분배
  • one-time-code 자동완성
  • role=group

타이핑하면 다음 칸으로 — 값은 갭 없는 문자열

사용 시점#

고정 길이 코드를 칸 단위로 받을 때 씁니다. 자유 형식·가변 길이 입력에는 일반 Input을 쓰세요.

권장 — 이렇게 쓰세요

지양 — 이러지 마세요

코드 입력SMS·OTP·PIN을 칸 단위로 — 기본 6칸 숫자

자유 입력엔 부적합가변·자유 형식엔 일반 Input — 칸 입력은 고정 길이 코드 전용

복구 코드영숫자 코드는 charSet='alphanumeric' + length로

동작#

입력결과
문자 타이핑현재 칸을 채우고 다음 칸으로 이동
붙여넣기커서 칸부터 여러 칸에 분배(유효 문자만)
Backspace현재 칸 비우기 / 빈 칸이면 이전 칸
칸 간 포커스 이동
허용 외 문자무시(numeric=0–9, alphanumeric=영숫자)
invalid각 칸 테두리 강조 + aria-invalid

Props#

Prop타입기본값설명
lengthnumber6칸 수 — 기본 6 (1..12로 클램프)
valuestring제어 값(부모가 상태 소유). 주면 defaultValue는 무시된다.
defaultValuestring비제어 초기값
onChange(value: string) => void값이 바뀔 때마다 호출 — 갭 없는 전체 코드 문자열
onComplete(value: string) => void모든 칸이 채워졌을 때 호출 — 완성된 코드
charSet'numeric' | 'alphanumeric'numeric허용 문자 — 숫자만 / 영숫자. 기본 numeric
disabledbooleanfalse비활성
invalidbooleanfalse오류 상태(테두리 강조 + aria-invalid)
autoFocusbooleanfalse첫 칸 자동 포커스
namestring폼 제출용 hidden input name(주면 전체 코드를 제출)
aria-labelstring일회용 코드그룹 라벨 — 보조기술용

코드 검증은 소비자(서버) 몫입니다 — 어드민 계정 복구(Security Settings 패턴) 흐름에서 복구 코드 입력에 씁니다.

접근성#

계약구현
그룹컨테이너 role="group" + aria-label
칸 라벨각 칸 aria-label(“N번째 자리”)
코드 자동완성첫 칸 autocomplete="one-time-code"(SMS·이메일 코드)
숫자 키패드numeric일 때 inputmode="numeric"
오류invalid 시 각 칸 aria-invalid