|
1 | | -안녕! 오랜만입니다 커피요정 개발자 이서현입니다 ㅎㅎ 이번 3주차 과제는 2주차 과제보다는 어렵지 않게 난이도를 조정했습니다. |
| 1 | +안녕하십니까. 간만에 돌아온 커피요정 개발자입니다. |
2 | 2 |
|
3 | | -이번 3주차 과제의 목표는 다양한 도메인에 대해 Aggregate하는 과정을 익혀보겠습니다. |
| 3 | +이번 과제는 여러분들이 알고 있는 구분형 권한 분리가 아닌 조건별 권한의 개념을 함께 느끼기 위해 제안된 과제입니다. ADMIN < USER < GUEST 이런 관계형 계층이 아닌 문서로 관리하는 세부 정책에 대해 명시하기 위한 과제입니다. |
4 | 4 |
|
5 | | -Aggregate란, 여러 도메인을 하나로 합치는 과정을 의미합니다. 이 과정에서 일관되고 클린한 구조로 코드를 작성하지 않으면 극악의 지옥을 맛보게 됩니다. 오늘 여러분은 다양한 자료구조들을 활용해 아래 과제를 도전하며 자료구조를 활용하는 노하우를 익혀보도록 하겠습니다. |
| 5 | +## IAM |
6 | 6 |
|
7 | | -# 1번 문제 |
| 7 | +권한 부여 및 관리 기능 구현 과제 |
8 | 8 |
|
9 | | -서비스를 개발하다보면 모니터링 서비스도 중요하지만 회원들의 정보를 통계를 내서 가공해 보는 화면이 필요할 때가 많습니다. 이를 어드민 페이지라고 합니다. |
| 9 | +아래 이미지는 IAM 서비스의 Data Diagram입니다. |
10 | 10 |
|
11 | | -어드민 페이지의 성격은 우선순위는 낮지만 기존에 있는 정보를 이용해 최대한 빠르게 구현해서 보여줘야 한다는 특징이 있습니다. 구현된 어드민 페이지는 개발자나 관리자의 만족도를 직접적으로 높이는데 크게 기여합니다. |
| 11 | +(아래 Condition Block은 이번 과제에서 제시하지 않는 필드이니 무시하셔도 됩니다 ) |
12 | 12 |
|
13 | | -더불어 웹/앱 호환성을 제공하는 데이터 제공은 중요합니다. 앱 서버의 특징은 웹 서버와는 다르게 화면(컴포넌트)단위로 데이터를 전송해야 하면 프론트 친구들이 좋아한다는 특징이 있습니다. (궁금하신 분들은 Http Capture라는 앱을 깔아서 앱에서 패킷을 뜯어보세용) |
| 13 | +<img width="621" alt="image" src="https://github.com/JNU-econovation/Spring_Hell_Study/assets/54030889/84ccf69f-f8bb-4ea7-99cf-109e4bb3b63a"> |
14 | 14 |
|
15 | | -때문에 아래 요구사항을 빠르게 구현하고 어드민 페이지를 구현해보도록 합시다. |
16 | 15 |
|
| 16 | +특정 서비스 및 리소스에 대한 접근 제어 및 권한 부여를 위한 서비스입니다. |
17 | 17 |
|
18 | | -아래 페이지는 신입모집 어드민 페이지입니다. |
| 18 | +## 구조 |
19 | 19 |
|
20 | | -하나의 API 요청에 모든 데이터를 담을 수 있도록 구성해봅시다. |
| 20 | +IAM Policy는 AWS 리소스에 대한 권한을 정의하는 JSON 문서입니다. 이 문서는 Optional top-level elements와 statement 두 가지 필드로 구성됩니다. |
21 | 21 |
|
22 | | -요구사항 |
| 22 | +### **1. Optional top-level elements** |
23 | 23 |
|
24 | | -- (현 지원 기수의) 지원자 누적 합계 |
25 | | -- 희망 분야 합계 (1순위 / 2순위)분리 |
26 | | -- 소속 학과 합계 |
27 | | -- 지원 경로 통계 |
28 | | -- 면접 희망시간 |
29 | | - - 위 면접 희망 시간은 인당 여러개를 선택할 수 있습니다. (3월 19일 3시, 4시, 5시) |
30 | | - - 특정 날짜에 대한 명시는 하지 않으며 다음과 같은 데이터형을 따릅니다,. |
| 24 | +```java |
| 25 | +{ |
| 26 | + "Version": "2012-10-17" |
| 27 | +} |
| 28 | +``` |
31 | 29 |
|
32 | | - `“desiredTime” : {{0,1}, {0,2}, {0,4}}` 이런식으로 각각의 좌표를 표현하시면 됩니다. |
| 30 | +### **1.1 Version** |
33 | 31 |
|
34 | | - - 화면의 표시 시간은 front에 처리를 위임합니다. |
35 | | - - desiredTime에 해당하는 userId List를 매핑시켜서 어드민 페이지에 포함하시면 됩니다. |
36 | | - - (0,1) → 4명, (2,5) → 2명, (3,4) → 0명 이런식으로 매핑시켜 API에 명시하세요. |
| 32 | +```json |
37 | 33 |
|
38 | | -모든 합계 요구사항은 모두 내림차순으로 데이터를 제공합니다. |
| 34 | +{ |
| 35 | + "Statement": [ |
| 36 | + { |
| 37 | + "Sid": "ExampleStatement1", |
| 38 | + "Effect": "Allow", |
| 39 | + "Principal": "*", |
| 40 | + "Action": "s3:ListBucket", |
| 41 | + "Resource": "arn:aws:s3:::example_bucket" |
| 42 | + }, |
| 43 | + { |
| 44 | + "Sid": "ExampleStatement2", |
| 45 | + "Effect": "Deny", |
| 46 | + "Principal": "*", |
| 47 | + "Action": "s3:DeleteObject", |
| 48 | + "Resource": "s3:::example_bucket/*" |
| 49 | + } |
| 50 | + ] |
| 51 | +} |
| 52 | +``` |
39 | 53 |
|
40 | | -관리자는 기본적으로 모든 데이터를 **생성/조회/수정/삭제**가 가능하고, 일반 회원은 아래의 정보를 **검색**만 할 수 있습니다. |
| 54 | +- **설명**: 정책 언어의 버전을 지정하는 필드입니다. |
| 55 | +- **제한 사항**: |
| 56 | + - **`2012-10-17`**: 현재 정책 언어 버전입니다. 새로운 정책 작성 시 반드시 이 값을 사용해야 합니다. 이 버전을 사용하지 않으면 최신 기능을 사용할 수 없습니다. |
| 57 | + - **`2008-10-17`**: 이전 정책 언어 버전입니다. 새로운 정책 작성이나 기존 정책 업데이트 시 사용하지 마세요. 최신 기능이 작동하지 않습니다. 예를 들어, **`${aws:username}`** 같은 변수는 문자열로 인식됩니다. |
41 | 58 |
|
42 | | -# 2번 문제 |
| 59 | +### **1.2 ID** |
43 | 60 |
|
44 | | -각 DB를 여러번 조회하는 과정에서 기존에 의미없는 요청 순서에서 지연 문제가 발생했습니다. |
| 61 | +- **설명**: 정책의 고유 식별자입니다. 자동으로 생성됩니다. |
| 62 | +- **제한 사항**: 없음 |
45 | 63 |
|
46 | | -- 데이터에 의존 관계가 없는데 조회 요청에 순서 때문에, API 지연이 발생했습니다 |
| 64 | +### **2. Statement** |
47 | 65 |
|
48 | | -위 문제를 개선하세요. |
| 66 | +### **2.1 Statement List** |
49 | 67 |
|
50 | | -## 3번 문제 |
| 68 | +- **설명**: 하나 이상의 단일 문 또는 개별 문의 배열을 포함합니다. |
| 69 | +- **제한 사항**: 리스트 형태로 여러 문을 포함할 수 있습니다. |
51 | 70 |
|
52 | | -위 구현 과제를 추상화 하세요. |
| 71 | +### **2.2 Sid (Statement ID)** |
53 | 72 |
|
54 | | -# 4번 문제 |
| 73 | +- **설명**: 정책 내 개별 문에 대한 설명 또는 고유 식별자로 사용됩니다. |
| 74 | +- **제한 사항**: |
| 75 | + - ASCII 대문자(A~~Z), 소문자(a~~z) 및 숫자(0~9)만 사용 가능합니다. |
| 76 | + - JSON 내에서 고유해야 합니다. 중복되면 안 됩니다. |
55 | 77 |
|
56 | | -위 문제를 해결하면서 해결한 과정을 정리하여 pdf로 제출하시길 바랍니다. |
| 78 | +### **2.3 Effect (필수 항목)** |
57 | 79 |
|
58 | | -제출지 : ymecca730135@gmail.com |
| 80 | +- **설명**: 명시적인 허용(Allow) 또는 거부(Deny)를 지정하는 필드입니다. |
| 81 | +- **제한 사항**: |
| 82 | + - **`Allow`** 또는 **`Deny`** 중 하나를 선택해야 합니다. |
| 83 | + - 기본적으로 모든 리소스는 거부됩니다. 명시적으로 허용하지 않으면 모두 거부됩니다. |
| 84 | + - 동일한 규제에 대해 Allow와 Deny가 동시에 존재하면 Deny가 우선 적용됩니다. |
59 | 85 |
|
60 | | -### 마감시간 : 2024:05:11/21:30 |
| 86 | +### **2.4 Principal** |
| 87 | + |
| 88 | +- **설명**: 보안 주체(사용자, 그룹, 역할 등)를 지정합니다. 주로 리소스 기반 정책의 요소로 사용되는데, |
| 89 | + |
| 90 | + ```json |
| 91 | + "Principal" : { |
| 92 | + "ECONO": [ |
| 93 | + "123456789012", |
| 94 | + "555555555555" |
| 95 | + ] |
| 96 | + } |
| 97 | + |
| 98 | + "Principal" : "*" |
| 99 | + 위 2가지 형태 모두 표시가 가능합니다. |
| 100 | + |
| 101 | + ``` |
| 102 | + |
| 103 | +- **제한 사항**: 특정 형식의 문자열로 지정해야 합니다. |
| 104 | +- Principal에 ECONO라고 적힌 경우 리스트로 해당하여 특정 계정의 Id의 list 형태를 받을 수 있습니다. |
| 105 | + |
| 106 | +### **2.5 NotPrincipal** |
| 107 | + |
| 108 | +- **설명**: 보안 주체를 제외하는 필드입니다. |
| 109 | +- **제한 사항**: Principal과 동일하게 특정 형식의 문자열로 지정해야 합니다. 제한 사항은 Principal과 동일합니다. |
| 110 | + |
| 111 | +### **2.6 Action** |
| 112 | + |
| 113 | +- **설명**: 정책에서 허용하거나 거부하는 작업(액션)을 지정합니다. |
| 114 | +- **제한 사항**: `:` 문자를 seperator로 지정합니다. : 의 좌측은 정책을 허용할 서비스의 이름(s3, iam, sqs, sns, s3 … ) 를 명시할 수 있습니다. |
| 115 | +- : 우측에 존재하는 문자는 GET, PUT, POST, DELETE 4가지만을 허용합니다. |
| 116 | +- `MARK` 를 적용한 경우 들어오는 PII에 대해 비식별 처리를 진행합니다. |
| 117 | +- **비식별 처리의 구현은 아래 3번 내용을 확인하세요** |
| 118 | + |
| 119 | +### **2.7 NotAction** |
| 120 | + |
| 121 | +- **설명**: 정책에서 제외할 작업(액션)을 지정합니다. |
| 122 | +- **제한 사항**: Effect : Allow와 혼합해서 사용할 수 있습니다. |
| 123 | + |
| 124 | +```json |
| 125 | +"Effect": "Allow", |
| 126 | +"NotAction": "DELETE", |
| 127 | +"Resource": "s3:*", |
| 128 | +``` |
| 129 | + |
| 130 | +위 예시를 살펴 보면 s3의 모든 리소스에 대해서 모든 행위를 허용하겠다라는 의미입니다. ( 단, DELETE 행위에 대해서는 위 정책을 포함하지 않겠다라는 의미입니다. ) |
| 131 | + |
| 132 | +### **2.8 Resource** |
| 133 | + |
| 134 | +- **설명**: 정책에서 적용할 리소스를 지정합니다. |
| 135 | +- **제한 사항**: *를 작성할 경우 모든 동작(GET, PUT, POST, DELETE)을 허용합니다. |
| 136 | + |
| 137 | +```json |
| 138 | +"Resource": "sqs" |
| 139 | +``` |
| 140 | + |
| 141 | +위 예제는 sqs라는 서비스를 타겟으로 제한하는 것입니다. |
| 142 | + |
| 143 | +String으로 자유롭게 명시는 가능합니다. |
| 144 | + |
| 145 | +### **2.9 NotResource** |
| 146 | + |
| 147 | +- **설명**: 정책에서 제외할 리소스를 지정합니다. |
| 148 | +- **제한 사항**: Resource와 동일하게 특정 형식의 문자열로 지정해야 합니다. |
| 149 | + - 다른 제한사항은 Resource와 동일합니다. |
| 150 | + |
| 151 | +### **리터럴 문자열 변환 기능** |
| 152 | + |
| 153 | +- **설명**: 정책 변수의 리터럴 문자열 변환 기능을 on/off하는 기능입니다. |
| 154 | +- **제한 사항**: |
| 155 | + - **`2012-10-17`** 버전에서는 정책 변수가 변수로 인식됩니다. |
| 156 | + - **`2008-10-17`** 버전에서는 정책 변수가 리터럴 문자열로 취급됩니다. |
| 157 | + |
| 158 | +이 설명을 통해 IAM Policy의 구성 요소와 각 요소의 제한 사항을 이해할 수 있습니다. 정책을 작성할 때 이 지침을 따라야만 정책이 올바르게 작동하며, 최신 기능을 활용할 수 있습니다. |
| 159 | + |
| 160 | +# 3. PII(개인 식별 정보) 비식별화 |
| 161 | + |
| 162 | +### 개인 식별 정보란? |
| 163 | + |
| 164 | +개인 식별 정보(PII)는 **개인을 식별하는 데 사용할 수 있는 모든 데이터**입니다. 개인과 직간접적으로 연결되는 모든 정보는 PII로 간주됩니다. 이름, 이메일 주소, 전화번호, 은행 계좌 번호, 정부 발급 신분증 번호는 모두 PII의 예입니다. |
| 165 | + |
| 166 | +이 때 MARK로 IAM Action이 명시된 경우 다음과 같은 비식별화를 진행하세요 |
| 167 | + |
| 168 | +### 제한사항 |
| 169 | + |
| 170 | +위 과제는 전화번호, 주민등록 번호를 대상으로만 진행하도록 하겠습니다. |
| 171 | + |
| 172 | +전화번호 : (010-1111-2222)의 경우 맨 뒷자리를 제외한 가운데 1111에 대해서 XXXX로 대체합니다. (010-XXXX-2222) |
| 173 | + |
| 174 | +주민등록 번호 : 950000-1234567 일 경우 맨 뒤 번호 6자리를 X로 비식별화합니다. ( 950000-1XXXXXX) |
| 175 | + |
| 176 | +위 2가지 대상에 대한 제한 및 변경 기능을 추가하세요. |
| 177 | + |
| 178 | +위 개인 식별 정보는 모든 사람은(예외 인원은 없습니다) 비식별화된 정보만 열람이 가능하다. |
| 179 | + |
| 180 | +ps) 위 제한사항은 개인정보 보호법 준수를 위한 비식별 조치 가이드라인에 착안하여 제안드리는 과제입니다. |
| 181 | + |
| 182 | +아래 링크를 궁금하시다면 확인해보세요. |
| 183 | +https://www.mois.go.kr/frt/bbs/type010/commonSelectBoardArticle.do?bbsId=BBSMSTR_000000000008&nttId=55287 |
| 184 | + |
| 185 | +# 요구사항 |
| 186 | + |
| 187 | +위 서비스의 제한사항을 구현하고 특정 요청에 대해 요청이 가능한지 true/false를 반환하는 API를 작성하세요. |
| 188 | + |
| 189 | +Http Method : GET , POST, … |
| 190 | + |
| 191 | +url : /check/resource/{resource} |
| 192 | + |
| 193 | +data : {key value형의 Map data ( 자유도에 맏기도록 하겠습니다. ) |
0 commit comments