가드레일
스펙에 적은 가드레일이 실제로 테스트되고 있는지 확인합니다. 규약은 가드레일 id = 테스트 이름입니다.
가드레일
231
스펙에 적힌 것
테스트 있음
45
테스트 없음
186
문서로만 있음
critical 미확인
63
확인되고 있는 비율 — 19%
19%
가드레일을 스펙에 적는 것과 그게 지켜지는지 확인하는 것은 다른 일입니다. 이 페이지가 없으면 148개가 전부 지켜지고 있는 것처럼 읽힙니다.
테스트가 있어도 무엇을 겨냥하는지가 중요합니다. 서버 API 를 직접 치는 테스트는 서버가 맞는지만 봅니다 — 화면에서 그 API 까지 이어지는 배선이 끊겨도 통과합니다. 실제로 비밀번호 재설정이 그랬습니다(API 맵 → 받아 줄 곳이 없는 호출).
확인하는 테스트가 없는 가드레일 (186)
| 심각도 | 가드레일 | 내용 | 화면 |
|---|---|---|---|
| critical | admin-account-no-password-exposure | 계정 목록 응답에 비밀번호가 실리면 안 된다. | 관리자 관리 |
| critical | admin-console-rejects-student | 수강생 계정으로는 로그인되지 않아야 한다. | 관리자 로그인 |
| critical | admin-console-requires-login | 비로그인 상태로 어떤 관리자 화면에도 머무를 수 없어야 한다. | 관리자 로그인 |
| critical | apply-flag-whitelist | 허용 목록(complete · absence · sms) 밖의 이름은 거부해야 한다. | 상담신청 |
| critical | apply-requires-admin | 신청자의 연락처와 문의 내용이 들어 있어 관리자만 볼 수 있어야 한다. | 상담신청 |
| critical | assets-served-locally | 화면이 원본 사이트로 자산을 요청하지 않는다. | 전 화면 공통 |
| critical | board-content-xss-safe | 본문 HTML 에 스크립트가 들어 있어도 실행되면 안 된다. | 공지 상세 |
| critical | board-detail-matches-server-shape | 상세 화면이 기대하는 응답 구조와 서버가 주는 구조가 같아야 한다. | 공지 상세 |
| critical | board-search-injection-safe | 검색어에 따옴표·SQL 예약어를 넣어도 정상 동작하고 오류가 나면 안 된다. | 공지사항 |
| critical | board-sort-whitelist | 정렬 파라미터에 임의 컬럼명을 넣어도 SQL 에 그대로 들어가면 안 된다. | 공지사항 |
| critical | books-not-servable-by-asset-path | 교재는 공개 자산 경로로 열리지 않는다. | TESOL 강의실 |
| critical | books-require-course-access | 수강 권한이 없는 과정의 교재는 받을 수 없다. | TESOL 강의실 |
| critical | books-require-login | 로그인하지 않으면 강의 교재를 받을 수 없다. | TESOL 강의실 |
| critical | catalog-price-matches-order | 목록에 보이는 판매가와 실제 주문 생성 금액이 같아야 한다. | 수강신청 안내 |
| critical | certificate-address-own-only | 요청에 회원을 담아 보내도 남의 주소를 바꿀 수 없어야 한다. | TESOL 학생정보 |
| critical | classroom-no-quiz-when-closed | 수강기간이 아니거나 미결제면 응시 버튼이 나오면 안 된다. | TESOL 강의실 |
| critical | consultation-submits-to-server | 1:1 무료컨설팅 신청은 실제로 접수돼야 한다. | 전 화면 공통 |
| critical | counseling-history-requires-admin | 상담 이력은 관리자만 보고 쓸 수 있어야 한다. | 상담신청 |
| critical | counseling-history-server-side-merge | 지난 이력은 서버가 읽어 이어 붙여야 한다. 화면이 보낸 본문을 그대로 쓰면 안 된다. | 상담신청 |
| critical | document-path-stays-in-kind-dir | DB 의 파일 경로가 자료 종류 디렉터리를 벗어나면 읽지 않아야 한다. | TESOL 학생정보 |
| critical | document-requires-login | 토큰 없이 자료를 받을 수 없어야 한다. | TESOL 학생정보 |
| critical | find-id-sends-not-returns | 찾은 아이디를 응답에 실으면 안 된다. 메일 · 문자로만 보낸다. | 아이디 찾기 |
| critical | find-pw-screen-reaches-server | 비밀번호 찾기 화면의 요청이 실제로 서버까지 닿아야 한다. 화면은 /api/identity/auth/find-pw 를 부르는데 그 라우트가 없으면 Auth.js catch-all 이 400 으로 삼켜, 화면에는 그냥 실패로만 보인다. | 비밀번호 찾기 |
| critical | global-no-price-from-client | 금액은 절대 클라이언트가 보낸 값을 쓰지 않는다. 서버가 product 테이블에서 다시 읽어야 한다. | 전 화면 공통 |
| critical | global-server-side-guard | 화면 진입을 막는 검사는 제출(서버 액션 · API)에서도 똑같이 한 번 더 해야 한다. 화면 가드만 있으면 직접 POST 로 우회된다. | 전 화면 공통 |
| critical | home-loads-without-login | 비로그인 상태에서 홈이 정상적으로 떠야 한다. | 홈 |
| critical | jwt-secret-shared-between-servers | 인증 서버가 발급한 토큰을 API 서버가 검증할 수 있어야 한다. | 로그인 |
| critical | legal-links-alive | 동의를 받는 화면의 약관 링크가 살아 있어야 한다. | 이용약관 |
| critical | legal-text-matches-origin | 본문이 원본 PHP 의 <pre> 안 평문과 한 글자도 다르지 않아야 한다. | 이용약관 |
| critical | leveltest-answer-not-leaked | 문항 조회 응답에 정답이 절대 실리면 안 된다. | 레벨테스트 |
| critical | leveltest-exam-input-type-by-number | 1~10 은 radio, 11~15 는 text 입력이어야 한다. 보기가 없다고 문항을 통째로 빠뜨리면 안 된다. | 레벨테스트 응시 |
| critical | leveltest-exam-no-answer-in-html | 렌더된 HTML 어디에도 정답 표시가 없어야 한다. | 레벨테스트 응시 |
| critical | leveltest-result-no-lookup-api | 접수번호로 남의 결과를 조회하는 API 를 만들면 안 된다. | 레벨테스트 결과 |
| critical | leveltest-subjective-graded | 주관식도 채점 대상이다. 만점이 객관식 개수(10)로 잘리면 안 된다 — 15 여야 한다. | 레벨테스트 |
| critical | leveltest-subjective-in-answer-table | 주관식 답안이 level_test_answer.a11~a20 에 저장돼야 한다. level_test_poll_answer 는 설문용이므로 쓰면 안 된다. | 레벨테스트 |
| critical | login-success-not-reported-as-failure | 로그인에 성공하면 실패 메시지가 뜨면 안 된다. | 로그인 |
| critical | login-token-has-no-secret | 토큰 페이로드에 비밀번호 해시 등 민감 정보를 담지 않는다. | 로그인 |
| critical | login-works-in-production-build | 프로덕션 빌드에서도 로그인과 세션 조회가 되어야 한다. | 로그인 |
| critical | member-no-credential-fields | 비밀번호와 아이디를 고치는 길이 없어야 한다. | 회원 관리 |
| critical | myclass-shows-only-entitled | 수강권이 없는 과정은 입구가 열려 보이면 안 된다. | 내 강의실 홈 |
| critical | order-amount-requires-admin | 결제 금액은 관리자만 고칠 수 있어야 한다. | 결제 관리 |
| critical | pay-fails-loudly-without-config | 상점키가 없으면 조용히 성공시키지 말고 거부해야 한다. | 카드 결제 |
| critical | privacy-text-matches-origin | 본문이 원본 personalData.php 와 한 글자도 다르지 않아야 한다. | 개인정보처리방침 |
| critical | profile-change-requires-login | 로그인하지 않으면 이름 · 영문 이름을 바꿀 수 없다. | TESOL 학생정보 |
| critical | profile-change-targets-token-owner | 이름 · 영문 이름은 토큰의 회원 것만 바꾼다. | 전 화면 공통 |
| critical | progress-own-only | 요청에 회원을 담아 보내도 남의 진도를 조작·조회할 수 없어야 한다. | 강의 영상 |
| critical | progress-requires-login | 비로그인은 기록도 조회도 할 수 없어야 한다. | 강의 영상 |
| critical | qna-write-requires-login | 비로그인 상태로 작성 화면에 머무를 수 없고, API 직접 호출도 거부돼야 한다. | 문의 작성 |
| critical | qna-write-requires-login | 비로그인 상태로 문의 작성 API 를 호출하면 거부돼야 한다. | Q&A |
| critical | qna-writer-from-token | 작성자를 요청 본문으로 지정할 수 없어야 한다. | 문의 작성 |
| critical | qna-writer-from-token | 작성자를 요청 본문으로 지정할 수 없어야 한다. 이름 · 아이디는 토큰에서만 온다. | Q&A |
| critical | quiz-guard-reapplies-on-submit | 제출 API 는 조회 API 와 같은 자격 검사를 다시 수행해야 한다. 화면을 거치지 않은 직접 호출도 막혀야 한다. | TESOL 시험 응시 |
| critical | quiz-no-answer-leak | 문제지 조회 응답에 정답(correct)이 절대 포함되면 안 된다. | TESOL 시험 응시 |
| critical | quiz-tec-uses-tec-flags | TEC 응시 자격은 TESOL 플래그가 아니라 TEC 전용 컬럼으로 판정해야 한다. | TEC 시험 응시 |
| critical | result-own-only | 남의 응시 결과를 조회할 수 없어야 한다. 항상 로그인한 본인 기록만 나온다. | TESOL 시험 결과 |
| critical | result-tec-own-only | 남의 결과를 조회할 수 없어야 한다. | TEC 시험 결과 |
| critical | signin-log-long-login-id | 아이디가 길어도 로그인이 되어야 한다. | 로그인 |
| critical | signup-account-usable-after-race | 경합을 겪은 계정도 로그인·비밀번호 재설정이 되어야 한다. | 회원가입 |
| critical | signup-no-duplicate-under-race | 같은 아이디로 동시에 가입해도 하나만 만들어져야 한다. | 회원가입 |
| critical | ssr-matches-client | 서버가 그린 화면과 브라우저가 그린 화면이 같아야 한다. | 전 화면 공통 |
| critical | student-own-data-only | 항상 로그인한 본인 정보만 나와야 한다. | TESOL 학생정보 |
| critical | student-scan-requires-pass | 합격 전에는 스캔본 다운로드가 노출되지도, API 로 받아지지도 않아야 한다. | TESOL 학생정보 |
| critical | video-requires-entitlement | 수강권이 없는 사용자가 영상 정보를 받아가면 안 된다. | 강의 영상 |
| high | admin-account-no-self-lockout | 자기 계정을 스스로 승인 해제할 수 없어야 한다. | 관리자 관리 |
| high | admin-content-requires-admin | 세 조회 모두 관리자만 볼 수 있어야 한다. | 배너 · Unit · 레벨테스트 (조회) |
| high | admin-login-no-user-enumeration | 없는 아이디와 틀린 비밀번호의 응답이 같아야 한다. 계정 존재 여부가 드러나면 안 된다. | 관리자 로그인 |
| high | admin-no-double-refund | 이미 cancel 인 주문은 다시 환불되면 안 된다. | 결제 관리 |
| high | admin-refund-no-tid-blocked | TID 없는 카드 주문은 환불을 막고 안내해야 한다. 상태를 바꾸면 안 된다. | 결제 관리 |
| high | assets-no-broken-images | 게시글 본문의 이미지가 실제로 그려져야 한다. | 전 화면 공통 |
| high | board-detail-404 | 없는 id 로 열면 500 이 아니라 404 여야 한다. | 공지 상세 |
| high | board-hit-only-on-read | 게시판 목록을 여는 것만으로 글 상세를 불러오면 안 된다 — 조회수가 오른다. | 전 화면 공통 |
| high | board-paging-bounds | page=0, page=-1, 범위를 넘는 page 에도 오류 없이 빈 목록이나 첫 페이지를 돌려줘야 한다. | 공지사항 |
| high | board-visible-value-per-table | FAQ 는 소문자 y/n 으로 저장해야 한다. 대문자면 원본 화면에서 안 보인다. | 게시판 4종 (공지 · 후기 · 합격노트 · FAQ) |
| high | board-writer-column-per-table | 수기·후기는 name 칸을 채워야 한다. NOT NULL 이라 비우면 저장이 실패한다. | 게시판 4종 (공지 · 후기 · 합격노트 · FAQ) |
| high | books-download-works | 수강 중인 과정의 교재는 PDF 로 내려온다. | TESOL 강의실 |
| high | catalog-inactive-hidden | is_active 가 false 인 상품은 목록에 나오면 안 된다. | 수강신청 안내 |
| high | certificate-address-per-course | TESOL 과 TEC 주소가 섞이면 안 된다. | TESOL 학생정보 |
| high | classroom-lesson-count-matches-db | 화면의 레슨 수가 DB 의 레슨 수와 같아야 한다(TESOL 36, TEC 56). | TESOL 강의실 |
| high | classroom-next-kind-only-one | 한 유닛에 응시 버튼이 두 개 이상 보이면 안 된다. 다음 차수 하나만. | TESOL 강의실 |
| high | classroom-tec-lesson-count | TEC 강의실의 레슨 수가 DB 와 같아야 한다(56). | TEC 강의실 |
| high | classroom-video-id-matches-lesson | Video 버튼이 여는 영상이 그 줄의 레슨과 일치해야 한다. | TESOL 강의실 |
| high | counseling-history-prepends | 새 이력이 위에 쌓이고 지난 것이 남아야 한다. | 상담신청 |
| high | counseling-history-stamped | 머리말에 날짜와 작성자가 원본 문구 그대로 붙어야 한다. | 상담신청 |
| high | faq-hidden-not-exposed | show 플래그가 꺼진 FAQ 는 목록에 나오면 안 된다. | Q&A |
| high | find-id-no-direct-disclosure | 응답 본문에 아이디를 그대로 실어 보내면 안 된다. 존재 여부도 드러나면 안 된다. | 아이디 찾기 |
| high | leveltest-exam-apply-required | apply 파라미터 없이 접근하면 /tesol-lab/level-test 로 돌려보내야 한다. | 레벨테스트 응시 |
| high | leveltest-exam-subjective-text-shown | 주관식 문항 텍스트가 화면에 보여야 한다. 안내 이미지로 대체하면 안 된다. | 레벨테스트 응시 |
| high | leveltest-no-login-required | 비로그인 상태에서 신청과 응시가 모두 가능해야 한다. | 레벨테스트 |
| high | leveltest-no-resubmit | 같은 접수번호로 두 번째 제출은 거절해야 한다. | 레벨테스트 |
| high | leveltest-question-count-from-db | 문항 수는 DB 에 채워진 개수를 따른다. 20개 고정으로 렌더해 빈 문항이 나오면 안 된다. | 레벨테스트 |
| high | leveltest-result-no-pass-verdict | 합격 · 불합격 문구가 나오면 안 된다. 정답 수만 보여 준다. | 레벨테스트 결과 |
| high | leveltest-step2-exists | 신청 후 실제 문제 풀이 화면으로 이어져야 한다. 신청 폼만 있고 끝나면 안 된다. | 레벨테스트 |
| high | leveltest-whitespace-tolerant | 주관식 답의 띄어쓰기가 달라도 정답으로 인정해야 한다. 공백을 모두 지우고 비교한다. | 레벨테스트 |
| high | login-no-user-enumeration | 없는 아이디와 틀린 비밀번호의 응답이 같아야 한다. | 로그인 |
| high | member-change-logged | 누가 무엇을 바꿨는지 로그와 modid · moddate 에 남아야 한다. | 회원 관리 |
| high | no-php-links | 화면에 .php 로 끝나는 내부 링크가 남아 있으면 안 된다. | 이용약관 |
| high | notice-pinned-first | 고정 공지는 정렬 방식과 무관하게 항상 목록 맨 위에 있어야 한다. | 공지사항 |
| high | order-amount-not-on-cancelled | 취소된 주문의 금액은 고칠 수 없어야 한다. | 결제 관리 |
| high | order-amount-range-checked | 0 이하이거나 1억을 넘는 금액은 거부해야 한다. | 결제 관리 |
| high | order-price-single-source | 신청 화면 가격과 상품 목록 가격이 항상 같아야 한다. | TESOL 수강신청 |
| high | order-required-fields | 성명 · 연락처 · 이메일이 비면 주문이 만들어지면 안 된다. | TESOL 수강신청 |
| high | order-tec-price-correct | TEC 신청 화면 정가가 1,770,000 이어야 한다. | TEC 수강신청 |
| high | orphan-records-admin-scoped | 관리자 조회도 회원 하나씩만 봐야 한다. 없는 회원이면 빈 결과다. | 전 화면 공통 |
| high | orphan-records-not-in-my-data | 회원이 없는(탈퇴·삭제된) 기록이 내 조회에 섞이면 안 된다. | 전 화면 공통 |
| high | outline-matches-curriculum | 커리큘럼 화면의 유닛·레슨 구성이 강의실(DB) 과 어긋나면 안 된다. | TESOL 커리큘럼 |
| high | outline-tec-matches-curriculum | TEC 커리큘럼 구성이 DB 와 어긋나면 안 된다. | TEC 커리큘럼 |
| high | passnote-detail-respects-show | 숨긴 수기를 id 로 직접 열어도 404 여야 한다. | 합격수기 상세 |
| high | passnote-hidden-not-exposed | show 가 꺼진 수기는 목록에도 상세에도 나오면 안 된다. | 합격수기 |
| high | pay-disabled-without-key | PG 키가 없으면 결제창을 열지 않고 안내해야 한다. 무통장 흐름은 영향받지 않아야 한다. | 카드 결제 |
| high | pay-no-double-approval | 이미 결제된 주문을 두 번 승인하면 안 된다. | 카드 결제 |
| high | poll-choice-separator | 보기 구분자는 ^ 가 있으면 ^, 없으면 쉼표다. | 레벨테스트 응시 |
| high | poll-choice-whitelist | 보기에 없는 값이 오면 거부해야 한다. | 레벨테스트 응시 |
| high | poll-multi-select | 한 문항에 여러 개를 고를 수 있어야 한다. 저장은 쉼표로 이어 붙인다. | 레벨테스트 응시 |
| high | poll-questions-parsed | 평탄한 q1~q20 이 문항 목록으로 서야 한다. 번호가 겹치거나 보기가 비면 안 된다. | 레벨테스트 응시 |
| high | poll-required-enforced | 필수 설문을 비운 채 제출하면 서버가 거부해야 한다. | 레벨테스트 응시 |
| high | poll-saved-with-answers | 설문은 답안지와 같은 트랜잭션에서 저장돼야 한다. 재제출은 막힌다. | 레벨테스트 응시 |
| high | profile-english-name-letters-only | 영문 이름은 영문자로만 받는다. | 전 화면 공통 |
| high | profile-english-name-saved | 영문 이름을 바꾸면 저장되고 학생정보에 그대로 보인다. | TESOL 학생정보 |
| high | profile-form-saves | 고친 값은 다시 열어도 남아 있다. | TESOL 학생정보 |
| high | profile-form-shown | 이름과 영문 이름을 화면에서 고칠 수 있다. | TESOL 학생정보 |
| high | progress-latest-first | playdata 배열 맨 앞이 최신이어야 한다. 이어보기가 그 값을 쓴다. | 강의 영상 |
| high | progress-per-course | TESOL 과 TEC 진도가 섞이면 안 된다. | 강의 영상 |
| high | qna-answer-status-accurate | 답변이 없는 문의가 답변완료로 표시되면 안 된다. | Q&A |
| high | qna-answer-status-follows-answer | 답이 있으면 답변완료, 비우면 답변대기여야 한다. 둘이 어긋나면 안 된다. | 질문답변 |
| high | qna-category-whitelist | 분류는 join · tesol 둘뿐이다. 임의 문자열이 저장되면 안 된다. | 문의 작성 |
| high | qna-category-whitelist | 분류는 join · tesol 둘뿐이다. 임의 문자열이 저장되면 안 된다. | Q&A |
| high | qna-detail-404 | 없는 id 는 404 여야 한다. | Q&A 상세 |
| high | quiz-multi-answer-persist | 복수정답은 "b,d" 형태로 저장돼야 한다. 첫 글자만 남으면 안 된다. | TESOL 시험 응시 |
| high | quiz-no-retake-after-pass | 이미 통과한 유닛은 남은 차수가 있어도 응시가 거부돼야 한다. | TESOL 시험 응시 |
| high | quiz-tec-only-two-kinds | TEC 에 kind=C 를 요청하면 거부해야 한다. | TEC 시험 응시 |
| high | result-kind-level-verdict | 0점인 차수가 PASS 로 보이면 안 된다. 배지는 그 차수 점수 기준이어야 한다. | TESOL 시험 결과 |
| high | result-tec-multi-answer-display | 복수정답 문항의 내 답안이 "b, d" 처럼 모두 보여야 한다. 하나만 보이면 안 된다. | TEC 시험 결과 |
| high | score-no-passed-units-is-zero | 합격 유닛이 하나도 없으면 평균이 0 이어야 한다(0 나누기 금지). | TESOL 성적표 |
| high | score-picks-latest-passing-kind | A 불합격 후 B 합격이면 B 점수가 잡혀야 한다. | TESOL 성적표 |
| high | score-tec-14-rows | TEC 성적표는 14행이어야 한다. | TEC 성적표 |
| high | signin-log-does-not-break-login | 이력을 못 남겨도 로그인은 되어야 한다. | 로그인 |
| high | signin-log-no-record-on-failure | 실패한 로그인은 이력에 남기지 않고, 통과시키지도 않아야 한다. | 로그인 |
| high | signup-sequential-duplicate-rejected | 순차로 같은 아이디를 넣어도 거절돼야 한다. | 회원가입 |
| high | university-register-content | 안내 문구와 신청서 · 환불규정 링크가 원본과 같고, 이미지가 실제로 그려진다. | 입학신청서 작성 안내 |
| high | university-register-linked | 강의실에서 입학신청서 화면으로 갈 수 있다. | 입학신청서 작성 안내 |
| high | unknown-path-is-404 | 없는 경로는 404 다. 500 이면 장애로 오해한다. | 공지 상세 |
| normal | admin-dashboard-hides-nothing | 아직 옮기지 않은 메뉴를 목록에서 감추면 안 된다. | 대시보드 |
| normal | admin-dashboard-shows-progress | 옮긴 화면 수와 전체 수가 보여야 한다. | 대시보드 |
| normal | admin-no-account-creation | 계정 생성 폼이 없어야 한다 — 권한 체계를 확인하기 전까지. | 관리자 관리 |
| normal | apply-shows-level-test-score | 레벨테스트 신청은 목록에서 점수나 "미응시"가 보여야 한다. | 상담신청 |
| normal | banner-list-all-types | 배너 목록이 타입 하나로 걸러지면 안 된다. 전체가 보여야 한다. | 배너 · Unit · 레벨테스트 (조회) |
| normal | board-crud-roundtrip | 네 게시판 모두 생성 → 수정 → 노출 토글 → 삭제가 왕복해야 한다. | 게시판 4종 (공지 · 후기 · 합격노트 · FAQ) |
| normal | board-hit-increments-once | 상세 조회 시 조회수가 정확히 1 올라야 한다. | 공지 상세 |
| normal | books-unknown-unit-404 | 없는 차수를 지목하면 404 다. | TESOL 강의실 |
| normal | certificate-address-form-shape | 주소 입력칸이 폼 안에 있어야 한다. | TESOL 학생정보 |
| normal | certificate-address-hidden-without-issue | 자격이 없으면 화면에 폼이 아예 나오지 않아야 한다. | TESOL 학생정보 |
| normal | certificate-address-roundtrip | 저장한 주소가 다시 읽혀야 하고, 두 번째 저장은 새 행이 아니라 갱신이어야 한다. | TESOL 학생정보 |
| normal | consultation-time-options | 상담 가능 시간대가 원본과 같아야 한다 — 평일 10~22시, 주말 10~18시. | 전 화면 공통 |
| normal | counseling-history-not-empty | 빈 내용은 저장하지 않아야 한다. | 상담신청 |
| normal | counseling-history-ui | 상세 화면에서 이력을 남기면 본문에 쌓여야 한다. | 상담신청 |
| normal | global-error-response-shape | 모든 API 오류는 같은 형태로 응답한다: { code, message, fieldErrors? }. | 전 화면 공통 |
| normal | hardcoded-screens-render | 박아 둔 데이터로 그리는 화면들이 오류 없이 떠야 한다. | 전 화면 공통 |
| normal | home-no-legacy-host-assets | 이미지·링크가 원본 사이트(wvctesol.com)를 가리키면 안 된다. 이관 대상이다. | 홈 |
| normal | legal-page-loads | 두 화면 모두 비로그인으로 오류 없이 떠야 한다. | 이용약관 |
| normal | leveltest-exam-all-required | 한 문항이라도 비면 제출되지 않고 몇 번인지 알려야 한다. | 레벨테스트 응시 |
| normal | leveltest-result-next-step | 결과 화면에서 다음 행동(상담 · 수강신청)으로 갈 수 있어야 한다. | 레벨테스트 결과 |
| normal | marketing-about-loads | 비로그인으로 정상 조회돼야 한다. | 대학 소개 |
| normal | marketing-cta-links-valid | 수강신청 · 레벨테스트 링크가 실제 존재하는 화면으로 연결돼야 한다. | TESOL 과정 소개 |
| normal | marketing-tec-loads | 비로그인으로 정상 조회돼야 한다. | TEC 과정 소개 |
| normal | member-progress-empty | 기록이 없으면 빈칸이 아니라 없다고 말해야 한다. | 회원 관리 |
| normal | member-progress-shown | 회원 상세에서 그 학생의 시청 기록과 학습일을 볼 수 있어야 한다. | 회원 관리 |
| normal | order-amount-editor-shown | 결제 목록에서 금액을 바로 고칠 수 있어야 한다. | 결제 관리 |
| normal | order-amount-updates | 고치면 금액만 바뀌고 상태·결제수단은 그대로여야 한다. | 결제 관리 |
| normal | orphan-records-member-list-clean | 회원 수 집계는 member 표만 세야 한다. 고아 기록이 수를 부풀리면 안 된다. | 전 화면 공통 |
| normal | outline-tec-titles-match-db | TEC 커리큘럼 제목도 DB 와 같아야 한다. | 전 화면 공통 |
| normal | outline-titles-match-db | 화면에 박아 둔 커리큘럼 제목이 DB 와 갈라지면 안 된다. | 전 화면 공통 |
| normal | phonics-no-quiz | 파닉스 화면에 시험 응시 진입점이 있으면 안 된다. | 파닉스 강의실 |
| normal | poll-numbers-sent | 화면이 그린 문항 번호가 함께 전송돼야 한다. | 레벨테스트 응시 |
| normal | poll-required-blocks-submit | 설문을 비우고 제출하면 화면에 사유가 보여야 한다. | 레벨테스트 응시 |
| normal | poll-result-shown | 레벨테스트 신청 상세에서 그 사람의 설문 답을 볼 수 있어야 한다. | 상담신청 |
| normal | poll-shown-on-exam | 응시 화면에 설문이 함께 나와야 하고 보기는 체크박스여야 한다. | 레벨테스트 응시 |
| normal | profile-form-shows-server-message | 거절된 값은 서버가 준 문구를 그대로 보여 준다. | TESOL 학생정보 |
| normal | progress-not-shown-when-unseen | 안 본 레슨에 0% 를 띄우면 안 된다. | 강의 영상 |
| normal | progress-player-loads | 영상 화면이 오류 없이 떠야 한다. | 강의 영상 |
| normal | progress-resume-position | 영상 화면이 마지막 위치를 들고 와야 한다. | 강의 영상 |
| normal | progress-shown-in-classroom | 본 레슨에는 강의실에 진도가 보여야 한다. | 강의 영상 |
| normal | qna-admin-cannot-write | 관리자가 문의를 새로 쓸 수 없어야 한다. | 질문답변 |
| normal | qna-write-validates | 제목 · 내용 · 분류가 비면 등록되지 않아야 한다. | Q&A |
| normal | review-list-loads | 목록이 페이징과 함께 정상 조회돼야 한다. | 수강후기 |
| normal | score-tec-label-module | TEC 성적표 행 라벨이 Module 이어야 한다. | TEC 성적표 |
| normal | signin-log-logout-always-ok | 로그아웃은 아이디가 없거나 이상해도 500 을 내면 안 된다. | 로그인 |
확인되고 있는 가드레일 (45)
| 심각도 | 가드레일 | 확인하는 테스트 |
|---|---|---|
| critical | global-ddl-auto-validate | servers/wvctesol-api/src/test/java/com/wvctesol/api/bootstrap/ApplicationConfigTest.java |
| critical | global-no-secret-in-source | servers/wvctesol-api/src/test/java/com/wvctesol/api/bootstrap/ApplicationConfigTest.java |
| high | global-domain-purity | shared/common-domain/src/test/java/com/wvctesol/common/domain/ArchitectureTest.java |
| high | global-legacy-format-at-edge | shared/common-domain/src/test/java/com/wvctesol/common/domain/ArchitectureTest.java |
| normal | signin-log-recorded | domains/identity/identity-app/src/test/java/com/wvctesol/identity/app/LoginUseCaseTest.java |
| critical | login-empty-password-account-blocked | domains/identity/identity-app/src/test/java/com/wvctesol/identity/app/LoginUseCaseTest.java |
| high | join-duplicate-blocked | domains/identity/identity-app/src/test/java/com/wvctesol/identity/app/SignUpUseCaseTest.java |
| critical | join-password-hashed | domains/identity/identity-app/src/test/java/com/wvctesol/identity/app/SignUpUseCaseTest.java |
| critical | join-no-entitlement-on-signup | domains/identity/identity-app/src/test/java/com/wvctesol/identity/app/SignUpUseCaseTest.java |
| critical | reset-link-only-by-mail | domains/notification/notification-app/src/test/java/com/wvctesol/notification/app/AccountNotificationsTest.java |
| high | notification-failure-does-not-break-flow | domains/notification/notification-app/src/test/java/com/wvctesol/notification/app/AccountNotificationsTest.java |
| critical | reset-token-single-use | domains/identity/identity-security/src/test/java/com/wvctesol/identity/security/PasswordResetTokenTest.java |
| critical | reset-token-expires | domains/identity/identity-security/src/test/java/com/wvctesol/identity/security/PasswordResetTokenTest.java |
| critical | score-average-excludes-failed | domains/learning/learning-domain/src/test/java/com/wvctesol/learning/domain/ScoreReportTest.java |
| critical | certificate-address-requires-issued | domains/learning/learning-domain/src/test/java/com/wvctesol/learning/domain/model/CertificateAddressTest.java |
| high | certificate-address-validated | domains/learning/learning-domain/src/test/java/com/wvctesol/learning/domain/model/CertificateAddressTest.java |
| critical | progress-percent-from-server | domains/learning/learning-domain/src/test/java/com/wvctesol/learning/domain/model/LectureProgressTest.java |
| high | progress-rejects-bad-values | domains/learning/learning-domain/src/test/java/com/wvctesol/learning/domain/model/LectureProgressTest.java |
| normal | progress-completed-threshold | domains/learning/learning-domain/src/test/java/com/wvctesol/learning/domain/model/LectureProgressTest.java |
| critical | classroom-tec-uses-tec-flags | shared/common-domain/src/test/java/com/wvctesol/common/domain/EntitlementsTest.java |
| critical | student-tec-uses-tec-columns | shared/common-domain/src/test/java/com/wvctesol/common/domain/EntitlementsTest.java |
| critical | phonics-requires-own-flag | shared/common-domain/src/test/java/com/wvctesol/common/domain/EntitlementsTest.java |
| critical | teaching-requires-own-flag | shared/common-domain/src/test/java/com/wvctesol/common/domain/EntitlementsTest.java |
| critical | quiz-pass-score-70 | domains/assessment/assessment-domain/src/test/java/com/wvctesol/assessment/domain/GraderTest.java |
| critical | quiz-sequential-unit-lock | domains/assessment/assessment-domain/src/test/java/com/wvctesol/assessment/domain/ExamEligibilityTest.java |
| critical | quiz-kind-order | domains/assessment/assessment-domain/src/test/java/com/wvctesol/assessment/domain/ExamEligibilityTest.java |
| critical | quiz-multi-answer-exact-match | domains/assessment/assessment-domain/src/test/java/com/wvctesol/assessment/domain/GraderTest.java |
| high | quiz-all-questions-required | domains/assessment/assessment-domain/src/test/java/com/wvctesol/assessment/domain/GraderTest.java |
| critical | order-amount-from-server | domains/commerce/commerce-app/src/test/java/com/wvctesol/commerce/app/PlaceOrderUseCaseTest.java |
| critical | order-bank-stays-ready | domains/commerce/commerce-app/src/test/java/com/wvctesol/commerce/app/PlaceOrderUseCaseTest.java |
| critical | order-no-entitlement-before-payment | domains/commerce/commerce-app/src/test/java/com/wvctesol/commerce/app/PlaceOrderUseCaseTest.java |
| critical | pay-verify-signature | domains/commerce/commerce-app/src/test/java/com/wvctesol/commerce/app/ApprovePaymentUseCaseTest.java |
| critical | pay-amount-match | domains/commerce/commerce-app/src/test/java/com/wvctesol/commerce/app/ApprovePaymentUseCaseTest.java |
| critical | pay-store-tid | domains/commerce/commerce-app/src/test/java/com/wvctesol/commerce/app/ApprovePaymentUseCaseTest.java |
| critical | admin-requires-admin-role | domains/commerce/commerce-app/src/test/java/com/wvctesol/commerce/app/AdminOrderUseCaseTest.java |
| critical | admin-confirm-opens-entitlement | domains/commerce/commerce-app/src/test/java/com/wvctesol/commerce/app/AdminOrderUseCaseTest.java |
| critical | admin-refund-revokes-entitlement | domains/commerce/commerce-app/src/test/java/com/wvctesol/commerce/app/AdminOrderUseCaseTest.java |
| critical | admin-refund-requires-pg-success | domains/commerce/commerce-app/src/test/java/com/wvctesol/commerce/app/AdminOrderUseCaseTest.java |
| normal | admin-login-legacy-hash-upgrade | domains/identity/identity-app/src/test/java/com/wvctesol/identity/app/AdminLoginUseCaseTest.java |
| high | admin-login-approval-required | domains/identity/identity-app/src/test/java/com/wvctesol/identity/app/AdminLoginUseCaseTest.java |
| critical | order-no-default-price-fallback | domains/commerce/commerce-app/src/test/java/com/wvctesol/commerce/app/PlaceOrderUseCaseTest.java |
| critical | order-bundle-opens-both | domains/commerce/commerce-app/src/test/java/com/wvctesol/commerce/app/AdminOrderUseCaseTest.java |
| high | admin-login-no-account-enumeration | domains/identity/identity-app/src/test/java/com/wvctesol/identity/app/AdminLoginUseCaseTest.java |
| critical | member-field-whitelist | domains/identity/identity-domain/src/test/java/com/wvctesol/identity/domain/model/MemberFieldTest.java |
| high | member-value-format | domains/identity/identity-domain/src/test/java/com/wvctesol/identity/domain/model/MemberFieldTest.java |