| A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | AA | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 요구사항 ID | 요구사항명 | 기능 ID | 기능명 | 요구사항 내용 | 필수 데이터 | 선택적 데이터 | 성능, 사용자 편의성 | 신뢰성 및 가용성 | 보안성 | |||||||||||||||||
2 | MEM_01 | 로그인 | MEM_01_01 | 일반 로그인 | 1. 로그인 정보인 이메일과 비밀번호 정보를 입력받아서 인증을 진행해야 한다. 2. 인가를 위한 Access Token을 client의 Header로 전달해야 한다. 3. Access Token 관리를 위한 Refresh Token을 �Redis에 저장해야 한다. | 이메일, 비밀번호 | 1. 로그인 시스템은 빠르게 동작해야 하며, 로그인 대기시간은 3초를 넘겨선 안된다. 2. 로그인 절차는 복잡해서는 안되며, 로그인 종류 선택과 이메일 패스워드 입력, 로그인 버튼만을 간결하게 제공해야 한다. 3. 비밀번호 재설정에 필요한 이메일 인증에서, 이메일 전송 대기 시간은 3초를 넘겨서는 안된다. 4. 회원정보 수정에 소요되는 시간은 2초를 넘겨선 안된다. 5. 회원탈퇴 버튼은 사용자에게 너무 노출되지는 않되 접근이 너무 어렵지 않아야 한다. | 1. 로그인 시스템은 항상 24시간 사용 가능해야 한다. 2. 로그인 시스템의 다운타임은 가능한 최소화 되어야 하며, 다른 필수 시스템의 복구 후에 곧바로 복구 되어야 한다. 3. 로그인에 실패했을 경우 실패 원인에 대한 적절한 메시지를 제공해야 한다. | 1. 인증되지 않은 사용자에게 로그인을 허용해선 안된다. 2. 인증된 사용자에 한해서만 토큰을 활용한 인가 절차를 진행한다. | ||||||||||||||||||
3 | MEM_01_02 | 간편 로그인 | 1. 구글 연동을 통해 SNS 로그인 버튼을 통해 인증을 진행한다. 2. 인가를 위한 Access Token을 client의 Header로 전달해야 한다. 3. Access Token 관리를 위한 Refresh Token을 Redis에 저장해야 한다. | SNS 로그인으로 전달 받은 토큰값 | |||||||||||||||||||||||
4 | MEM_01_03 | 비밀번호 재설정(비 로그인) | 이메일을 입력받아 인증을 진행하고 인증이 성공한 경우 새로운 비밀번호로 변경을 진행할 수 있어야 한다. | 새로운 비밀번호, 새로운 비밀번호 확인 | |||||||||||||||||||||||
5 | MEM_01_04 | 비밀번호 재설정(로그인) | 기존 비밀번호 입력 후 새로운 비밀번호를 입력받아 기존 비밀번호가 일치하는 경우 새로운 비밀번호로 변경을 진행할 수 있어야 한다. | 기존 비밀번호, 새로운 비밀번호, 새로운 비밀번호 확인 | |||||||||||||||||||||||
6 | MEM_01_05 | 로그아웃 | 1. Access Token을 Redis에 블랙리스트로 등록해야 한다. 2. Refresh Token을 Redis에서 삭제해야 한다. | ||||||||||||||||||||||||
7 | MEM_01_06 | 회원탈퇴 | 독수리 릴리즈 서비스에서 회원 탈퇴할 수 있어야 한다. 1. 회사, 프로젝트 등의 오너가 회원 탈퇴를 하더라도 함께 삭제되어서는 안되고 유지되어야 한다. | ||||||||||||||||||||||||
8 | MEM_01_07 | 개인정보수정 | 사용자의 개인 정보를 확인 및 수정할 수 있어야 한다. | 닉네임 수정 시 - 변경할 닉네임 비밀번호 변경 시 - 변경할 비밀번호 | |||||||||||||||||||||||
9 | MEM_02 | 회원가입 | MEM_02_01 | 일반 회원가입 | 1. 회원 가입 정보인 필수 데이터를 입력 받고 이메일 중복 검사 및 인증를 후에 회원가입을 진행해야 한다. 2. 회원 가입 시 이미 등록된 유저인지 검증해야 한다. 3. 이메일의 형식이 유효한 형식인지 검증해야 한다. 4. 비밀번호 등록 시 제약(영문 1글자 이상, 특수문자 1개 이상, 총 길이 8글자 이상)을 검증해야 한다. | 이메일, 비밀번호, 비밀번호 확인, 닉네임, 이름 | 1. 회원가입 요청의 처리 시간은 너무 길면 안된다. 회원가입 요청 처리 시간은 3초를 넘겨선 안된다. 2. 회원가입 절차는 복잡해서는 안되며, 회원가입 시 필요한 정보 입력과 이메일 인증 컴포넌트를 간결하고 쉽게 제공해야 한다. 3. 이메일 인증번호 전송 대기 시간은 3초를 넘겨서는 안된다. 4. 회원가입에 필요한 약관을 사용자에게 명시적으로 제공하고, 확인할 수 있도록 해야한다. | 1. 회원가입 시스템은 항상 24시간 사용 가능해야 한다. 2. 회원가입 시스템의 다운타임은 최소화 되어야 하며, 다른 필수 시스템의 복구 후에 곧바로 복구되어야 한다. 3. 이메일 발송은 회원가입을 원하는 사용자가 입력한 대상 이메일 주소로 정확하게 발송이 되어야 한다. 다른 주소로 전송되거나, 미전송이 되는 일 없이 제대로 동작해야 한다. 4. 사용자가 입력한 코드와 정확히 일치하는 경우에만 인증이 완료되어야 하며 부정확한 코드 입력이나 기타 다른 방식으로 인증이 완료되는 일은 없어야 한다. 5. SMTP 관련 설정값 등을 탈취당하는 일이 없어야 한다. 서비스에서 사용자에게 인증 메일을 신뢰성 있게 전송할 수 있도록 제어권을 가지고 있어야 한다. 6. 이메일 인증 시스템의 다운타임은 가능한 최소화 되어야 하며, 다른 필수 시스템의 복구 후에 곧바로 복구 되어야 한다. 7. 회원가입에 실패했을 경우 실패 원인에 대한 적절한 메시지를 제공해야 한다. 8. 생성된 토큰은 외부에 탈취당해선 안된다. 8-1. Access Token은 외부 탈취에 대비하여 만료시간을 짧게 설정해야 한다. 8-2. Access Token이 만료될 경우 Refresh Token을 통해 갱신될 수 있어야 한다. 8-3. Refresh Token은 외부 탈치에 대비하여 인증 과정에서 추가적인 정보를 요구할 수 있어야 한다. 9. 토큰을 통해 요청자의 권한을 정확히 식별하고, 해당 요청자에게 정확한 권한을 인가해야 한다. 10. 토큰을 생성하는 시점은 로그인 시점으로 고정되어야 한다. 토큰 발급 후 1주일이 지나 Refresh Token까지 만료된다면 사용자는 다시 로그인을 함으로서 토큰을 재생성할 수 있어야 한다. 11. JWT 토큰 시스템의 다운타임은 최소화 되어야 하며, 시스템의 오류가 해결되면 우선적으로 해결되어야 한다." | 1. 사용자의 회원가입 정보는 데이터베이스에 안전하게 저장되어야 한다. 특히 비밀번호 등의 정보는 암호화되어 저장되어야 하며, 암호화되지 않은 원문의 상태로는 취급해선 안된다. 2. 개인정보 처리 방침에 따라 개인정보 데이터를 보관, 취급, 파기해야 한다. 3. 이메일 인증 과정에서 사용자의 이메일, 개인정보 등이 유출되어선 안된다. 4. 이메일 인증이 완료되면 로그인, 회원 정보 (비밀번호) 변경, 회원 탈퇴 등과 같은 critical한 기능에 대한 실행 권한이 주어지기 때문에 이메일 인증 코드는 외부에 절대로 유출되어선 안된다. | ||||||||||||||||||
10 | MEM_02_02 | 간편 회원가입 | 1. 구글 연동을 위해 간편 로그인 버튼으로 인증을 진행해야 한다. 2. 만약 회원가입이 되어있지 않다면 간편 로그인을 통해 전달받은 데이터(이메일,이름)을 제외한 필수 데이터를 입력 받아 회원가입을 진행해야 한다. | 토큰 값을 통해 서버에서 전달받는 데이터 - 이메일, 이름 사용자로부터 입력 받는 데이터 - 닉네임 | |||||||||||||||||||||||
11 | MEM_02_03 | 이메일 인증 | 1. 입력받은 이메일이 유효한 형태인지 검증할 수 있어야 한다. 2. 입력받은 이메일로 인증 코드를 보낼 수 있어야 한다. 3. 전송 이메일과 인증 코드를 namespace:key value의 형태로 Redis로 저장할 수 있어야 한다. 4. 인증 코드의 유효 시간이 만료되면 인증 코드가 일치하여도 인증이 되어선 안 된다. 5. 인증 코드 유효 시간은 3분이어야 한다. 6. 전송한 코드가 일치하는지 검증할 수 있어야 한다. 7. 일반 회원가입 / 비로그인 비밀번호 재설정 시 사용해야 한다. | 이메일 | |||||||||||||||||||||||
12 | MAIN_01 | 홈 | MAIN_01_01 | header | 1. 홈 header 좌측의 로고를 클릭하면 홈 화면으로 이동할 수 있어야 한다. 2. 홈 header 우측의 '개발자' 버튼을 클릭하면 개발자 화면으로 이동할 수 있어야 한다. 3. 개발자 header 좌측에 '독수리 릴리즈 노트 개발자 모드' 로 명시되어야 한다. 4. 회사 선택 시 개발자 header 좌측에 '해당 회사 이름' + '개발자 모드' 로 명시되어야 한다. 5. 개발자 header 우측에 '�내정보' 버튼 클릭 시 drop down으로 이름(이메일), 정보수정 기능 버튼, 로그아웃 기능 버튼이 제공되어야 한다. 6. client header 좌측에 '해당 회사 이름' 이 명시되어야 한다. | 1. 홈 화면은 복잡하지 않고, 사용자가 필요한 기능만 직관적으로 접근할 수 있게 해야한다. 2. 회사 검색에 소요되는 시간은 3초를 넘겨선 안된다. 3. 회사 검색 결과는 직관적으로 표시되어야 하며, 회사 로고, 회사 명만 표시해야 한다. | 1. 검색창에서 회사를 검색했을 때 정확한 회사 정보가 나와야 한다. 2. 검색 시 동명의 회사가 있을 경우에는 회사 로고를 통해 다른 회사임을 정확히 구분할 수 있어야 한다. | ||||||||||||||||||||
13 | MAIN_01_02 | 검색 | 1. 텍스트 입력 창에서�사용자로부터 회사명을 입력받을 수 있어야 한다. 2. 돋보기 버튼을 눌러서 검색할 수 있어야 한다. | 검색할 회사명 문자열 | |||||||||||||||||||||||
14 | MAIN_01_03 | 회사 검색 결과 리스트 표시 | 사용자가 입력한 회사명과 일치하는 회사를 데이터베이스에서 조회하여 반환할 수 있어야 한다. | ||||||||||||||||||||||||
15 | MAIN_01_04 | 회사 구체 페이지 이동 | 검색 결과로 출력된 회사 리스트를 클릭함으로서 해당 회사의 프로젝트들과 릴리즈 노트를 표시해주는 회사 구체 페이지로 이동할 수 있어야 한다. | ||||||||||||||||||||||||
16 | MAIN_01_05 | footer | 1. 개인정보처리방침으로 이동할 수 있는 '개인정보처리방침' 이라는 문구의 링크가 제공되어야 한다. 2. 메인 페이지로 이동하는 '홈' 버튼이 제공되어야 한다. | ||||||||||||||||||||||||
17 | DEV_01 | 개발자 기능 | DEV_01_01 | 내가 속해 있는 회사 리스트 조회 | 사용자가 속한 모든 회사 리스트를 조회할 수 있어야 한다. | 1. 내가 속한 회사의 리스트를 불러오는 시간은 2초를 넘겨선 안된다. 2. 내가 속한 프로젝트의 리스트를 불러오는 시간은 2초를 넘겨선 안된다. 3. 개발자 모드의 회사 생성, 삭제에 소요되는 시간은 2초를 넘겨선 안된다. 4. 개발자 모드의 맴버 추가, 멤버 삭제에 소요되는 시간은 2초를 넘겨선 안된다. 5. 프로젝트 생성, 수정, 삭제에 소요되는 시간은 2초를 넘겨선 안된다. 6. 회사에 멤버를 추가할때, 소요되는 시간은 1700ms를 넘겨선 안된다. 7. 개발자 모드의 카테고리 생성, 수정, 삭제에 소요되는 시간은 2초를 넘겨선 안된다. 8. 개발자 모드의 릴리즈 생성, 수정, 삭제에 소요되는 시간은 2초를 넘겨선 안된다. 9. 회사 정보를 수정및 조회할 수 있는 페이지로 이동할 수 있는 버튼은 직관적이어야 하며, 사용자가 접근하기 어려워선 안된다. 9.1 해당 버튼은 톱니바퀴 모양으로 명시적으로 존재해야 한다. | 1. 릴리즈 정보를 통해 사용자가 정확한 릴리즈 정보를 확인 할 수 있어야 한다. 2. 릴리즈 노트 작성 시 new, updated, fixed, deprecated, added 태그를 사용하여 명확한 정보를 제공해야 한다. 3. 회사 삭제 시 해당 회사에 속한 프로젝트는 삭제됨을 경고하는 팝업창을 띄워야 한다. 4. 회사 멤버 혹은 프로젝트 멤버 삭제 시 삭제할 것인지에 대한 확인창을 띄운 후 확인 버튼을 누르면 삭제할 수 있어야 하고, 멤버 리스트에 대한 정보를 항상 확인할 수 있어야 한다. 5. 내 정보 조회 시 내가 속한 회사와 참여중인 프로젝트가 모두 표시되어야 한다. 6. 카테고리 정보 수정, 릴리즈 수정 시 최종 편집자를 표시할 수 있어야 한다. | 1. 개발자 기능에서는 개인정보와 개인 데이터를 다루기 때문에 보안에 민감해야 하며, 개발자 기능과 관련된 api는 인가된 사용자의 검증을 확실하게 실시해야 한다. 또한 내부적으로 다음과 같은 상황들을 검증해야 한다. 1-1. 요청자와 인가된 사용자가 동일 인물인지 검증할 수 있어야 한다. 1-2. 요청자가 전달한 변경할 데이터가 제약조건을 위반하지 않는지 검증할 수 있어야 한다. 2. 인가되지 않은 사용자가 개발자 기능 관련 api를 호출하는 경우 접근을 통제하고 관련 안내메시지를 전달하여야 한다. 3. 비밀번호 데이터가 관여되는 기능이 실행될 경우 반드시 암호화 된 상태로 취급되어야 하며, 임호화되지 않은 원문은 취급하지 않는다. 비밀번호 변경 등의 기능에서 변경할 비밀번호와 기존 비밀번호를 비교할 경우 암호화된 상태로 비교해야 한다. 4. 회원 탈퇴 기능에 대해 제약이 존재해야 한다. 사용자의 실수 등을 방지하기 위해서 편의성을 포기하더라도 동의 버튼 혹은 특정 문장 타이핑 등과 같은 제약을 제공해야 한다. | |||||||||||||||||||
18 | DEV_01_02 | 내가 속해 있는 프로젝트 리스트 조회 | 사용자가 속한 모든 프로젝트 리스트를 조회할 수 있어야 한다. | ||||||||||||||||||||||||
19 | DEV_01_03 | 특정 회사 프로젝트 리스트 조회 | 사이드바 화면에서 특정 회사 내에 사용자가 속한 모든 프로젝트 리스트를 조회할 수 있어야 한다. | ||||||||||||||||||||||||
20 | DEV_01_04 | 회사 생성 | 1. 회사의 이름을 입력할 수 있어야 한다. 2. 회사의 로고를 첨부할 수 있어야 한다. | ||||||||||||||||||||||||
21 | DEV_01_05 | 회사 삭제 | 회사의 오너는 본인이 만든 회사를 삭제할 수 있어야 한다. | ||||||||||||||||||||||||
22 | DEV_01_06 | 회사 멤버 추가 | 1. 모든 멤버가 이메일 검색을 통해 회사에 멤버를 추가할 수 있어야 한다. 2. 존재하지 않는 이메일의 경우 에러 메시지를 보여주어야 한다. | ||||||||||||||||||||||||
23 | DEV_01_07 | 회사 멤버 삭제 | 모든 멤버가 오너를 제외한 회사에 속한 멤버를 삭제할 수 있어야 한다. | ||||||||||||||||||||||||
24 | DEV_01_08 | 프로젝트 생성 | 1. 모든 회사의 멤버가 프로젝트를 생성할 수 있어야 한다. 2. 프로젝트 이름, 설명, 공개범위를 정할 수 있어야 한다. | ||||||||||||||||||||||||
25 | DEV_01_09 | 프로젝트 삭제 | 본인이 만든 프로젝트의 경우에만 삭제할 수 있어야 한다. | ||||||||||||||||||||||||
26 | DEV_01_10 | 프로젝트 멤버 추가 | 프로젝트에 속해있는 모든 멤버가 이메일 검색을 통해 프로젝트에 멤버를 추가할 수 있어야 한다. | ||||||||||||||||||||||||
27 | DEV_01_11 | 프로젝트 멤버 삭제 | 프로젝트에 속해있는 모든 멤버가 프로젝트에 속한 멤버를 삭제할 수 있어야 한다. | ||||||||||||||||||||||||
28 | DEV_01_12 | 프로젝트 정보 변경 | 프로젝트에 속해있는 모든 멤버가 프로젝트의 이름, 설명, 공개범위를 수정할 수 있어야 한다. | ||||||||||||||||||||||||
29 | DEV_01_13 | 카테고리 생성 | 프로젝트 편집 시 카테고리 추가 버튼을 클릭하여 카테고리를 생성하고 제목 및 설명을 추가할 수 있으며, 자세한 내용은 마크다운 형식으로 편집할 수 있어야 한다. | ||||||||||||||||||||||||
30 | DEV_01_14 | 카테고리 삭제 | 프로젝트 편집 시 카테고리 삭제 버튼을 클릭하여 카테고리를 삭제할 수 있어야 한다. 1. 카테고리가 삭제된다면 해당 카테고리에 속했던 릴리즈들도 함께 삭제되어야 한다. | ||||||||||||||||||||||||
31 | DEV_01_15 | 카테고리 정보 수정 | 카테고리의 제목, 설명, 내용물에 대해 수정할 수 있어야 하며, 적용 버튼을 통해 일괄적으로 적용할 수 있어야 한다. | ||||||||||||||||||||||||
32 | DEV_01_16 | 내 정보 조회 | 사이드바 화면에서 사용자 이름, 사용자 이메일과 같은 내 정보를 상시 조회할 수 있어야 한다. | ||||||||||||||||||||||||
33 | DEV_01_17 | 릴리즈 생성 | 카테고리 별로 릴리즈 정보를 생성할 수 있고, 버전, 날짜, 태그, 변경이력에 대해 입력이 가능해야 한다. | ||||||||||||||||||||||||
34 | DEV_01_18 | 릴리즈 삭제 | 각 릴리즈 마다 삭제 버튼을 클릭하여 해당 릴리즈 정보를 삭제할 수 있어야 한다. | ||||||||||||||||||||||||
35 | DEV_01_19 | 릴리즈 수정 | 각 릴리즈 마다 수정 버튼을 클릭하여 정보를 수정할 수 있어야 한다. | ||||||||||||||||||||||||
36 | DOK_01 | 프로젝트 | DOK_01_01 | 프로젝트 리스트 조회 | 사이드바 화면에서 프로젝트 리스트를 조회할 수 있어야 한다. 1. 출력된 프로젝트를 클릭할 경우 프로젝트 제목, 설명 및 하위 카테고리 리스트를 조회할 수 있어야 한다. | 1. 일반 모드의 프로젝트 리스트 조회에 소요되는 시간은 3초를 넘겨선 안된다. 2. 일반 모드의 카테고리 리스트 조회에 소요되는 시간은 3초를 넘겨선 안된다. 3. 일반 모드의 카테고리 상세내용 조회에 소요되는 시간은 1500ms를 넘겨선 안된다. 4. 일반 모드의 릴리즈 노트 상세내용 조회에 소요되는 시간은 1500ms를 넘겨선 안된다. | 1. 사용자는 특정 회사가 생성한 프로젝트 리스트 중 공개로 설정된 프로젝트만을 조회 할 수 있어야 한다. 2. 각 프로젝트 마다 카테고리 리스트를 조회할 수 있어야 한다. 3. 각 카테고리에 대한 상세 내용을 조회할 수 있어야 한다. 4. 각 카테고리 별 릴리즈 정보를 조회할 수 있어야 한다. | ||||||||||||||||||||
37 | DOK_01_02 | 카테고리 리스트 조회 | 사이드바 화면에서 프로젝트 하위의 카테고리 리스트를 조회할 수 있어야 한다. 1. 출력된 카테고리를 클릭할 경우 카테고리 상세내용을 조회할 수 있어야 한다. | ||||||||||||||||||||||||
38 | DOK_01_03 | 카테고리 상세내용 조회 | 1. 카테고리 제목, 설명, 상세내용을 조회할 수 있어야 한다. | ||||||||||||||||||||||||
39 | DOK_01_04 | 릴리즈 노트 상세내용 조회 | 1. 전체 릴리즈들을 카테고리 별로 구분하여 한 페이지에서 조회할 수 있어야 한다. 2. 카테고리별로 구분된 각각의 릴리즈를 클릭하면, 해당 카테고리로 이동할 수 있어야 한다. | ||||||||||||||||||||||||
40 | |||||||||||||||||||||||||||
41 | |||||||||||||||||||||||||||
42 | |||||||||||||||||||||||||||
43 | |||||||||||||||||||||||||||
44 | |||||||||||||||||||||||||||
45 | |||||||||||||||||||||||||||
46 | |||||||||||||||||||||||||||
47 | |||||||||||||||||||||||||||
48 | |||||||||||||||||||||||||||
49 | |||||||||||||||||||||||||||
50 | |||||||||||||||||||||||||||
51 | |||||||||||||||||||||||||||
52 | |||||||||||||||||||||||||||
53 | |||||||||||||||||||||||||||
54 | |||||||||||||||||||||||||||
55 | |||||||||||||||||||||||||||
56 | |||||||||||||||||||||||||||
57 | |||||||||||||||||||||||||||
58 | |||||||||||||||||||||||||||
59 | |||||||||||||||||||||||||||
60 | |||||||||||||||||||||||||||
61 | |||||||||||||||||||||||||||
62 | |||||||||||||||||||||||||||
63 | |||||||||||||||||||||||||||
64 | |||||||||||||||||||||||||||
65 | |||||||||||||||||||||||||||
66 | |||||||||||||||||||||||||||
67 | |||||||||||||||||||||||||||
68 | |||||||||||||||||||||||||||
69 | |||||||||||||||||||||||||||
70 | |||||||||||||||||||||||||||
71 | |||||||||||||||||||||||||||
72 | |||||||||||||||||||||||||||
73 | |||||||||||||||||||||||||||
74 | |||||||||||||||||||||||||||
75 | |||||||||||||||||||||||||||
76 | |||||||||||||||||||||||||||
77 | |||||||||||||||||||||||||||
78 | |||||||||||||||||||||||||||
79 | |||||||||||||||||||||||||||
80 | |||||||||||||||||||||||||||
81 | |||||||||||||||||||||||||||
82 | |||||||||||||||||||||||||||
83 | |||||||||||||||||||||||||||
84 | |||||||||||||||||||||||||||
85 | |||||||||||||||||||||||||||
86 | |||||||||||||||||||||||||||
87 | |||||||||||||||||||||||||||
88 | |||||||||||||||||||||||||||
89 | |||||||||||||||||||||||||||
90 | |||||||||||||||||||||||||||
91 | |||||||||||||||||||||||||||
92 | |||||||||||||||||||||||||||
93 | |||||||||||||||||||||||||||
94 | |||||||||||||||||||||||||||
95 | |||||||||||||||||||||||||||
96 | |||||||||||||||||||||||||||
97 | |||||||||||||||||||||||||||
98 | |||||||||||||||||||||||||||
99 | |||||||||||||||||||||||||||
100 |