2단계 인증은 7.0.6 에서 서버측이 갖춰졌지만 인증번호를 입력할 화면이 어느 버전에도
없었다. 그래서 그 설정을 켠 사이트는 관리자를 포함한 전원이 로그인할 수 없었다.
원인은 `POST /api/auth/login` 이 조건에 따라 **다른 형태의 200** 을 돌려준다는 것이다.
평소에는 `{token, user}` 지만 2단계 인증이 켜져 있으면 `{two_factor_required,
challenge_id, ...}` 를 돌려준다. 프론트는 앞의 형태만 선언하고 `response.data.user.language`
를 바로 읽었으므로 그 자리에서 TypeError 가 났고, 영문 원문이 로그인 화면에 그대로 노출됐다.
서버는 정상 응답했으므로 서버 로그에는 아무 흔적도 남지 않는다.
이어서 `setToken(undefined)` 가 `localStorage` 에 문자열 `"undefined"` 를 남겼다.
이 값은 truthy 라 이후 모든 요청이 `Bearer undefined` 로 나가 401 이 되고, 사용자에게는
「세션이 만료되었습니다」로 보인다. 관리자 로그인은 한발 더 나가 `null->isAdmin` 으로
500 이 되어, 설정을 되돌릴 수단까지 함께 사라졌다.
## 구현
- 로그인 응답을 판별 유니온(`LoginResult`)으로 표현하고, 형태를 판별한 뒤에 읽는다.
`ApiClient.setToken` 은 비어 있지 않은 문자열만 저장한다.
- 사용자·관리자 로그인 화면에 인증번호 입력 단계를 추가했다. 같은 카드 안에서 넘어가며
「인증번호 다시 받기」와 「처음부터」를 제공한다. 관리자 판정은 코드 확인에 성공한 뒤에
수행하고, 거부할 때는 그 직전에 발급된 토큰을 회수한다.
- 재발송(`login/two-factor/resend`)은 기존 challenge 를 취소하고 새로 발행한다. 유효한
코드를 여러 개 살려 두면 대입 시도의 표적이 넓어진다.
- 인증번호를 보내지 못하면 401 이 아니라 503 으로 답한다. 자격 증명은 올바른데 401 로
뭉개면 사용자는 비밀번호를 의심하며 같은 시도를 반복하고, 운영자는 메일 설정이 깨진
사실을 알 방법이 없다.
- 공개 본인인증 경로(`identity/verify`·`cancel`)가 로그인 목적의 challenge 를 소진하지
못하도록 403 게이트를 세웠다. 소진되면 그 challenge 로 영영 로그인할 수 없다.
- 로그인 시도 제한 429 응답이 다국어 문구를 싣도록 했다(종전에는 프레임워크 기본 영문).
- 다국어 파라미터에서 파이프 표현식이 평가되지 않아 「유효시간 까지」처럼 값이 빠지던
문제를 함께 고쳤다. 같은 결함이 문의 목록 화면에도 있었다.
## 이번 점검에서 함께 고친 것
- 계정 잠금(423)·발송 실패(503) 응답이 사용자·관리자 컨트롤러에 동일하게 복제돼 있었고
그 주석 자신은 "단일 지점에서 만든다" 고 적혀 있었다. 페이로드에 필드가 하나 추가되면
한쪽만 따라가 같은 실패를 두 화면이 다르게 안내하게 된다 — 트레이트로 통합했다.
- 테스트가 개발자 자신의 사이트 설정을 읽고 있었다. 2단계 인증을 켜 둔 환경에서는 로그인
성공을 전제한 테스트가 503 으로 깨지는데 실패 메시지가 원인을 가리키지도 않는다.
같은 결함군을 위해 이미 존재하던 단일 지점에 그 축을 추가했다.
## 버전
코어 7.0.11 · sirsoft-basic 1.1.4 · sirsoft-admin_basic 1.0.9 ·
번들 일본어팩 3종 · 템플릿 엔진 engine-v1.65.0.
11 KiB
11 KiB
Changelog
이 언어팩의 모든 주요 변경사항을 기록합니다. 형식은 Keep a Changelog를 따르며, Semantic Versioning을 준수합니다.
[1.1.3] - 2026-09-07
Added
- 로그인 화면의 2단계 인증(인증번호 입력·다시 받기·처음부터·유효 시각)과 계정 잠금 해제 시각 안내의 일본어 번역을 추가했습니다.
[1.1.2] - 2026-08-24
Fixed
- 첫 화면 소개 문구의 제품명이 한국어로 표시되던 문제를 수정했습니다.
[1.1.1] - 2026-08-19
Added
- 통합검색 실패 안내 문구(
search.failed.title,search.failed.suggestion) 일본어 번역 추가 — 검색 중 오류가 발생했을 때 "검색 결과 없음" 과 구분되는 오류 안내가 일본어 로케일에서 자연스럽게 표시됩니다. (#103 @Tuwasduliebst 님께서 제보해주셨습니다.)
[1.1.0] - 2026-08-10
Added
- 회원가입 화면의 휴대폰번호·전화번호 입력란 라벨·안내 문구(
auth.mobile,auth.phone) 일본어 번역 추가 — 회원가입 시 연락처 입력란이 일본어 로케일에서 자연스럽게 표시됩니다. - 모달 닫기 버튼의 안내 라벨(
common.close_modal) 일본어 번역 추가 — 화면 낭독기 사용자에게 버튼 용도가 일본어로 안내됩니다. - 검색 결과 건수 표기와 검색어 구체화 안내(
search.result_count_suffix_at_least,search.refine_query_hint) 일본어 번역 추가 — 총 건수를 상한까지만 센 경우의 "N건 이상" 표기가 일본어 로케일에서 자연스럽게 표시됩니다. - 편집기 화면 문구(
editor.*) 일본어 번역 보강. - 주문서의 환불 계좌 입력란 문구(
shop.checkout.refund_bank_*— 안내 제목, 은행 선택, 계좌번호·예금주 입력 안내, 부분 입력 주의) 일본어 번역 추가 — 무통장입금·가상계좌로 주문할 때 환불받을 계좌를 남기는 영역이 일본어 로케일에서 자연스럽게 표시됩니다.
Changed
- 화면 편집기 상품 상세의 상태 미리보기 라벨(
editor.state.out_of_stock,editor.state.sold_out)을 서로 구분되도록 정정했습니다. 두 상태 모두 "品切れ" 로 표시되어 목록에서 어느 쪽인지 구별할 수 없었습니다.
[1.0.1] - 2026-07-08
Added
- 미발행 페이지 관리자 미리보기 안내 배너(
user.page.preview_banner) 일본어 번역 추가 — 관리자가 발행 전 페이지를 사용자 화면에서 미리 볼 때의 안내 문구가 일본어 로케일에서 자연스럽게 표시됩니다. - 첨부 개수 초과 안내 문구(
attachment.upload_limit_exceeded) 일본어 번역 추가 — 게시글 첨부를 허용 개수보다 많이 선택했을 때의 안내가 일본어 로케일에서 자연스럽게 표시됩니다. - 게시판·상품 사용자 화면의 관리자 이동 링크 라벨(
admin_links.posts·admin_links.manage·상품admin_edit) 일본어 번역 추가 — 관리자가 사용자 화면에서 관리자 게시글 목록·게시판 관리·상품 편집으로 이동하는 링크가 일본어 로케일에서 자연스럽게 표시됩니다.
[1.0.0] - 2026-07-01
Added
- 비회원 주문 완료 화면의 주문 확인 메일 발송 안내(
shop.order_complete.guest_email_sent) 일본어 번역 추가 — 비회원으로 주문 시 입력한 이메일로 주문 확인 안내를 보냈다는 문구가 일본어 로케일에서 자연스럽게 표시됩니다. - 마이페이지 주문내역의 '일부취소' 보조 배지 일본어 번역 추가 (
orders.partial_cancelled_badge) — 일부 상품만 취소된 주문에 표시되는 보조 배지가 일본어 로케일에서 자연스럽게 표시됩니다. - 레이아웃 편집기 데이터 소스 라벨에 "리뷰 정책 설정"(
editor.data_source.reviewSettings) 일본어 번역 추가 — 리뷰 작성 화면의 리뷰 정책 데이터 소스 표시 명칭이 일본어 로케일에서 자연스럽게 표시됩니다. - 레이아웃 편집기 "비회원 주문 토큰 저장" 동작 라벨(
editor.action.save_guest_order_token.*) 일본어 번역 추가 — 동작 추가 목록의 비회원 주문 토큰 저장 동작과 토큰·주문번호·만료시각 입력 라벨이 일본어 로케일에서 자연스럽게 표시됩니다. - 상품 상세 옵션 품절 표시 접미 문구(
shop.product.sold_out_suffix) 일본어 번역 추가 — 재고 없는 옵션의 "(품절)" 표시가 일본어 로케일에서 자연스럽게 표시됩니다. - 상품 상세 품절 옵션 선택 안내 문구(
shop.product.sold_out_option) 일본어 번역 추가 — 품절된 옵션 선택 시 안내 메시지가 일본어 로케일에서 자연스럽게 표시됩니다. - 주문서 상품 쿠폰의 중복 적용 비활성 라벨(
checkout.coupon_already_used)과 쿠폰 적용 불가 안내 토스트(checkout.coupon_not_applied) 일본어 번역 추가 — 1인 사용 제한 쿠폰을 다른 상품에 이미 적용했거나 적용 조건을 충족하지 못한 경우의 안내가 일본어 로케일에서 자연스럽게 표시됩니다. - 추가옵션 직접입력 안내 일본어 번역 추가 — 추가옵션 직접입력 라벨·안내문구(
shop.additional_option_custom_text_label,..._placeholder,..._required)와 추가옵션 선택·금액·필수 안내(shop.additional_option_placeholder,additional_options_amount,additional_option_required)가 일본어 로케일에서 자연스럽게 표시됩니다. 상품 상세·장바구니 옵션변경에서 각인 문구 등을 직접 입력할 때의 라벨과 안내가 일본어로 노출됩니다. - 배송국 설정·배송 가능 여부 안내 일본어 번역 추가 — 회원가입·마이페이지의 기본 배송국 설정 라벨·안내(
register_shipping_country.*,mypage.shipping_country_settings.*)와 장바구니·주문서의 배송 가능 여부 안내(shop.shippability.*,shop.shipping_country)가 일본어 로케일에서 자연스럽게 표시됩니다. - 레이아웃 편집기 헤더·테마·알림 컴포넌트 속성 컨트롤 라벨 일본어 번역 추가 (
editor.control.{hdr_*,tt_*,nc_*}+editor.component.header) — 헤더(사이트명·로고·게시판 표시 수 등)·테마 토글·알림 센터 컴포넌트의 속성 편집 컨트롤과 컴포넌트명이 일본어 로케일에서 자연스럽게 표시됩니다. - 마이페이지 주문 상세의 결제 통화 청구 안내(
order_detail.charged_in_payment_currency) 일본어 번역 추가 — 기본 통화와 다른 통화로 결제한 주문의 청구 통화·금액이 일본어 로케일에서 표시됩니다.
[1.0.0-beta.2] - 2026-05-21
Added
- 레이아웃 편집기 트리의 모달 화면명 일본어 번역 추가 (
modal_label.*— 이용약관·개인정보처리방침·주문 취소·장바구니 삭제 확인 등) — 위지윅 편집기 트리의 모달 노드가 영문 식별자 대신 일본어 화면명으로 표시됩니다. - 레이아웃 편집기 페이지 상태 라벨 일본어 번역 추가 (
editor.state.{address_modal_list,address_modal_form,order_show_default,order_change_address_manual,user_base_default,mobile_menu_open,gdpr_cookie_banner_visible,identity_challenge_inicis}) — 배송지 모달·주문 상세 배송지 변경·모바일 메뉴 펼침·쿠키 배너·본인인증 모달 등 화면 상태 미리보기 라벨이 일본어 로케일에서 자연스럽게 표시됩니다. - 레이아웃 편집기 데이터 소스·편집기 라벨 일본어 번역 동기화 (
editor.data_source.*등 신규/누락 키) — 속성 패널의 데이터 소스 표시 명칭 등 편집기 라벨이 일본어 로케일에서 자연스럽게 표시됩니다. - 레이아웃 편집기 배열 항목 편집기 라벨 일본어 번역 추가 (
editor.array_item.*·editor.array_field.*·탭/라벨/아이콘/배지/비활성 항목 라벨 등) — 탭 네비게이션 등 배열 prop 의 항목 단위 편집 라벨이 일본어 로케일에서 자연스럽게 표시됩니다. - 쇼핑몰 재주문 화면의 신규 텍스트 일본어 번역 추가
- 비회원 주문 흐름(주문 방식 선택, 비회원 주문서, 주문 조회/상세, 30분 자동 인증 안내) 신규 텍스트 일본어 번역 추가
- 로그인 화면 비회원 주문 진입 및 마이페이지 배송지 변경 관련 신규 텍스트 일본어 번역 추가
- 사용자 페이지(홈·로그인·게시판·쇼핑·검색·에러)의 페이지 제목 일본어 번역 추가
- 레이아웃 편집기 소셜 로그인 버튼 제공자 정의 편집 라벨 일본어 번역 추가 (
editor.array_item.provider·editor.array_field.provider·editor.provider.{naver,kakao}) — 로그인 화면의 소셜 로그인 제공자 목록 편집 라벨이 일본어 로케일에서 자연스럽게 표시됩니다. - 레이아웃 편집기 표(Table) 컴포넌트 라벨 일본어 번역 추가 (
editor.component.table) - 레이아웃 편집기 표 셀 배경색·내부 여백 카탈로그 및 표 셀(Td/Th) 컴포넌트 라벨 일본어 번역 추가 (
editor.cell_fill.*·editor.cell_padding.*·editor.component.{td,th}) — 셀 배경색 프리셋 색·내부 여백 단계 라벨과 표 셀 컴포넌트명이 일본어 로케일에서 자연스럽게 표시됩니다. - 레이아웃 편집기 정렬 박스 on/off 라벨 일본어 번역 추가 (
editor.control.flex_enable.{on,off}) — 디바이스별 정렬 박스 적용/해제 2상태 선택 라벨이 일본어 로케일에서 자연스럽게 표시됩니다. - 레이아웃 편집기 색 컨트롤 프리셋 색 라벨 일본어 번역 추가 (
editor.control.color_preset.*) — 글자색·배경색 컨트롤의 프리셋 색(회색 단계·흰색·파랑·빨강·초록) 라벨이 일본어 로케일에서 자연스럽게 표시됩니다. - 레이아웃 편집기 신규 스타일 컨트롤 라벨 일본어 번역 추가 (
editor.control.{box_shadow,border_style,border_color,border_radius,opacity,overflow,font_bold,font_italic,text_underline,whitespace,toggle}.*+text_align.justify+color_preset.gray_300) — 그림자·테두리·모서리 둥글기·투명도·스크롤·굵게/기울임/밑줄·줄바꿈·양쪽 정렬 컨트롤 라벨이 일본어 로케일에서 자연스럽게 표시됩니다. - 레이아웃 편집기 페이지 상태 토글 라벨 일본어 번역 추가 (
editor.state.*) — 캔버스 툴바의 페이지 상태(로그인/검증 실패·찜·배송지·재주문·상품 리뷰/문의 탭·게시판 활동 서브탭·검색 결과 탭·금액/세금 상세 펼침 등) 미리보기 라벨이 일본어 로케일에서 자연스럽게 표시됩니다. - 레이아웃 편집기 속성 탭 컨트롤 라벨 일본어 번역 추가 (
editor.control.{icon_name,img_src,img_alt,link_href,link_target,input_type,input_placeholder,input_name,input_required,input_disabled,field_label,field_error,field_helper,html_for,textarea_rows,elem_id,select_placeholder,select_options,component_size,button_variant,component_disabled}.*) — 아이콘·이미지·링크·입력 필드·선택지 등 비-스타일 속성 편집 컨트롤 라벨이 일본어 로케일에서 자연스럽게 표시됩니다.
[1.0.0-beta.1] - 2026-05-11
Added
- 기본 사용자 템플릿(sirsoft-basic)의 일본어 번들 언어팩 초기 제공