Security
킷이 맡는 보안과 내 서비스가 직접 챙겨야 할 보안 체크리스트입니다.
인증 킷은 보안의 일부만 대신해 줍니다. 아래 표는 킷이 맡는 부분과, 내 서비스를 운영하기 전에 직접 확인해야 하는 부분을 나눈 것입니다.
백엔드는 아직 구현 전이라 서버 쪽 항목은 설계 기준(예정)입니다. 구현되는 대로 이 표를 실제 동작에 맞춰 갱신합니다.
Who is responsible
| 항목 | 킷이 하는 일 | 내가 해야 할 일 |
|---|---|---|
| 비밀번호 저장 | 서버가 Argon2 같은 해시로만 저장하도록 설계 (원문 저장 안 함) | 해시 알고리즘·비용 설정을 운영 환경에서 점검 |
| 액세스 토큰 | 메모리에만 보관. localStorage에 저장하지 않음 | 토큰 수명을 서비스 성격에 맞게 조정 |
| 리프레시 토큰 | httpOnly 쿠키로 전달 (자바스크립트에서 읽을 수 없음) | 운영에서 Secure, SameSite 옵션 확인, HTTPS 사용 |
| 권한 검사 | 화면 가드(RequireAuth, RequireRole)와 서버 검증 구조 제공 | 내 API마다 서버에서 역할을 반드시 다시 검사 |
| 입력 검증 | 폼에서 형식·길이를 먼저 검사 | 서버에서 같은 규칙으로 다시 검증 |
| 가입 시 역할 | 화면에서 역할을 고르지 않음. 서버가 기본 역할 부여 | 기본 역할이 최소 권한(예: VIEWER)인지 확인 |
| 로그인 잠금 | 브라우저에서 n회 실패 시 m분 잠금, 새로고침해도 유지 (안내용) | 서버에서 같은 규칙으로 차단하고 429 + Retry-After 응답 |
| 비밀번호 재설정 | 메일 링크 화면과 안내 문구 제공 | 토큰 해시 저장, 짧은 만료, 단일 사용, 메일 발송 |
| 요청 횟수 제한 | 포함되지 않음 | 로그인·가입·재설정 메일 재발송에 레이트 리밋을 추가 |
| 이메일 인증 | 인증번호 받기·확인 화면, 재전송 대기(안내용) | 증표를 서버가 검증하고, 인증번호는 해시 저장·짧은 만료·시도 횟수 제한 |
| 파일 첨부 | 형식·크기·개수 사전 검사 (편의용) | 서버가 실제 내용·크기를 다시 검사하고 안전한 이름으로 저장 |
| 권한 변경 | 확인 창과 위험 변경 경고 | MASTER만 허용, 마지막 MASTER 보호, 변경 기록 |
| 약관 동의 증빙 | 필수 약관 미동의 시 가입 차단 (화면) | 서버도 필수 약관을 검증하고 동의 시각을 저장 |
| 감사 로그 | 포함되지 않음 | 역할 변경, 탈퇴 처리 같은 관리 작업의 기록이 필요하면 추가 |
| HTTPS·CORS | 같은 도메인 프록시(/api)로 CORS 부담을 줄임 | 운영에서 HTTPS 강제, 허용 출처 최소화 |
Browser side
- React는 기본적으로 출력값을 이스케이프합니다.
dangerouslySetInnerHTML은 쓰지 마세요. - 액세스 토큰을 로그, URL, 쿼리 문자열에 남기지 마세요.
- 화면에서 버튼을 숨기는 것은 사용자 편의입니다. 숨겼다고 접근이 막힌 것이 아닙니다.
Server side (planned)
- 모든 보호 API는 요청의 토큰에서 사용자를 확인하고, 역할이 허용되는지 검사합니다.
- 사용자 정보를 돌려줄 때
password_hash를 절대 포함하지 않습니다. - 일반 사용자가 자신의 역할을 바꾸거나 다른 사용자의 데이터를 읽지 못하게 합니다.
- 계정 삭제는 바로 지우지 않고
deactivated_at을 기록해 막고, 보관 기간 뒤 개인정보만 지웁니다(deleted_at).
Before going live
- 시드 관리자 계정의 비밀번호를 바꾸거나 계정을 삭제했는지
- JWT 비밀키가 운영용으로 새로 생성되었고 저장소에 없는지
.env가 커밋되지 않았는지- 운영 환경에서 HTTPS와 쿠키
Secure옵션이 켜져 있는지 - 내 모든 API에 서버 측 권한 검사가 있는지
- 로그인 잠금과 요청 횟수 제한이 서버에도 있는지 (브라우저 잠금만으로는 부족)
- 비밀번호 재설정 토큰이 해시로 저장되고 만료·단일 사용인지
- 샘플 약관(
/terms,/privacy)을 실제 약관으로 교체했는지 - 개발용 안내(
/docs라우트)를 끄거나 별도 주소로 옮겼는지
