전체 글 (245)
2025-08-30 16:54:59
반응형

🔐 Domain 1-1: Design Secure Access to AWS Resources

✨ 핵심 개념

  • 보안은 아키텍처 설계 시 가장 먼저 고려해야 할 요소
  • 사람, 도구, 애플리케이션이 어떻게 AWS 리소스와 데이터를 접근할지 정의해야 함
  • 접근 제어 범위:
    • 누가/무엇이 리소스를 시작·중지할 수 있는지
    • 언제/어떻게 접근 권한을 주고 운영 권한을 제어할지

🧱 기본 지식 (Fundamentals)

  • 공유 책임 모델 (Shared Responsibility Model)
  • AWS 글로벌 인프라 (리전, AZ, 엣지 로케이션)
  • 서비스 내구성 & 가용성

🧑‍💻 AWS 계정과 IAM

  • AWS IAM은 Global 서비스 → 모든 리전 공통으로 적용
  • Root User
    • 계정 생성 시 자동으로 생성되는 슈퍼 계정
    • 권한 변경 불가, 탈취 시 전체 환경이 위험 → 절대 일상 사용 금지
    • 보호 방법: MFA 활성화, 별도 권한이 제한된 IAM 사용자 생성
  • IAM User / Group / Role
    • 신규 IAM 사용자는 기본 권한 없음
    • Least Privilege(최소 권한 원칙) 적용 → 필요 최소 권한만 부여
    • Users : 특정 사용자에게 직접 권한 부여
    • Groups : 공통 권한을 여러 사용자에게 부여
    • Roles : AWS 리소스나 외부 사용자/서비스가 임시로 권한 획득

🔑 권한 부여 (Policies)

  • Policy = 권한을 정의하는 객체
  • Identity-based Policy
    • User/Group/Role에 부착 → “누가 무엇을 할 수 있는가”
  • Resource-based Policy
    • S3, SQS, KMS, VPC Endpoint 등에 부착 → “누가 이 리소스에 접근할 수 있는가”
    • 차이점: Principal 명시 필요
  • IAM Policy 문서 구조
    • Version
    • Statement
      • Effect (Allow/Deny)
      • Action (어떤 API 호출 가능?)
      • Resource (대상 리소스)
      • Principal (리소스 정책에만 존재)

🌍 연동 & Federation

  • STS(Security Token Service) → 임시 보안 자격 증명 제공
  • Federation
    • 회사 AD(Active Directory)나 외부 IdP와 연동 → AWS 리소스 접근 위임
    • SAML 2.0, OIDC 기반 싱글사인온(SSO) 활용

🚫 잘못된 접근

  • 앱 코드에 하드코딩된 AWS 키 ❌
  • 대신 사용해야 하는 방법:
    • IAM Role + Instance Profile (EC2, Lambda 등)
    • AWS SDK + IAM Role 자동 인증
    • AWS Secrets Manager / SSM Parameter Store

📊 추적 & 모니터링 (Traceability)

  • 누가, 무엇이, 언제, 어디서 접근했는지 기록/추적 필수
  • 관련 서비스:
    • AWS CloudTrail (API 호출 기록)
    • AWS Config (리소스 변경 추적)
    • Amazon CloudWatch (로그/메트릭)
    • GuardDuty, Security Hub, Inspector, Macie (위협 탐지 & 보안 분석)

🏛 멀티 계정 관리

  • AWS Organizations → 다계정 구조 관리
  • Service Control Policies(SCP) → 계정 단위 권한 제한
  • AWS Control Tower → 계정 생성·거버넌스 자동화

📌 정리

  • IAM = 글로벌 서비스, Root User는 반드시 보호(MFA 필수, 사용 지양)
  • 사용자 접근: Users / Groups / Roles 조합 + 최소 권한 원칙
  • 권한 부여: Identity-based Policy vs Resource-based Policy 구분
  • 외부 사용자 접근: Federation + STS
  • 애플리케이션 접근: 절대 키 하드코딩 금지 → Role/Secrets Manager 활용
  • 추적성(Traceability) 확보: CloudTrail, Config, GuardDuty 등
  • 멀티 계정 전략: Organizations + SCP + Control Tower
반응형
2025-08-13 23:12:41
반응형

Exception in thread "main" java.lang.RuntimeException: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.util.ArrayList<db.Record>` from Object value (token `JsonToken.START_OBJECT`) at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 1] at db.RecordRepository.getRecords(RecordRepository.java:52) at Application.main(Application.java:12) Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.util.ArrayList<db.Record>` from Object value (token `JsonToken.START_OBJECT`) at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 1] at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59) at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1794) at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1568) at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1515) at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.handleNonArray(CollectionDeserializer.java:404) at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:253) at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:29) at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:342) at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4971) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3887) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3870) at db.RecordRepository.getRecords(RecordRepository.java:45) ... 1 more

 

Error 정리


“Cannot deserialize value of type ArrayList<Record> from Object value (START_OBJECT)” → 서버에서 배열 [...]이 아니라 객체 {...} 가 왔는데, 코드가 List<Record> 로 파싱하려다 실패한 겁니다.

대부분 아래 중 하나가 원인입니다.

Supabase REST 호출이 배열을 반환하도록 구성되지 않음

테이블 조회는 /{table}?select=* 형태여야 항상 [] 배열이 옵니다. ?select=* 빠지거나 경로/대소문자 틀리면 에러 객체 {message, hint, …} 가 옵니다.

헤더 누락/권한 오류(401/403) 로 에러 JSON 객체가 반환

apikey 와 Authorization: Bearer <SUPABASE_KEY> 둘 다 필요.

애초에 단건(RPC/싱글 오브젝트) 을 반환하는 엔드포인트를 불렀는데, 코드가 List<Record> 로 읽음.

 

Supabase -> MyProject -> API Docs -> TABLE NAME -> Bash -> Link Copy

API Key 문제인 줄 알았으나 Supabase REST API BASE URL Link 오타였음.

 

 

Parsing - 문법적 해부

Compile - 기계어 번역

 

* 참고 블로그 링크 : https://m.blog.naver.com/36513535/10021194977

반응형
2025-08-13 22:33:20
반응형

IntelliJ 프로그램 종료 및 재실행 후 정상 동작

 

* 참고 블로그

https://jinchaeeun.tistory.com/29

반응형

'Cloud Engineering Bootcamp > 1. JAVA' 카테고리의 다른 글

IntelliJ VM Option 이슈  (0) 2025.08.13
2025-08-13 22:30:44
반응형

메모리 많이 잡아 먹어서 건들이다 블루스크린

윈도우 탐색기 주소창에 입력 : %AppData%

경로 - C:\Users\userid\AppData\Roaming\JetBrains\IdeaIC2025.1

수정할 파일명 : idea64.exe.vmoptions

 

1. 메모장에 드래그 한 다음 설정된 내용 지우기 
2. InteliJ 프로그램 재시작

 

* 참고 블로그 링크 :

https://backendcode.tistory.com/278

 

[IntelliJ] Error launching IDEA Improperly specified VM option 해결 방법

개요 인텔리제이(IntelliJ)에서 VM Option을 설정하다가 재시작을 하니 Error launching IDEA라는 에러가 발생하며 인텔리제이를 실행할 수 없었습니다. Improperly specified VM option. To fix the problem, edit your JVM op

backendcode.tistory.com

https://stackoverflow.com/questions/45846624/intellij-idea-failed-to-create-jvm-error-code-1

반응형
2025-08-06 23:14:12
반응형

 

 

 

 

 

 

 

 

 

* udemy 클린 코드 무료 강의

https://www.udemy.com/course/yeipvrxp/

반응형
2025-08-06 21:59:27
반응형

1. 코드 = 커뮤니케이션

설명을 통하지 않고 코드로만 대화해도 이해할 수 있어야함

 

커뮤니케이션 실패

cons d = " "; // 경과 시간

이런 코드를 만드는 사람이 하는 생각

- 난 잘 이해되는데?

- 어짜피 코드 위아래를 보면 어떤 의미인지 알 수 있지 않아?

But

- 다른 개발자들이 이 코드를 보면 무너지 이해가 될까?

- 시간이 지나고 직접 만든 당사자가 봐도 이해 못 할 수도


2-1. 의도를 명확히 밝혀라

변수 이름만 봐도 어떤 역할을 하는지 알 수 있어야 함

 

변수명은 구체적으로

Bad  →  작성자만 알 수 있는 약어로 쓰여져 있음

if (t === DaysType.Day) {
}
// t가 무슨 의미일까요?

const cbm = (d: Days[]) => d.map((dd: Days) => dd.month());
// cbm, d, dd 가 무슨 의미일까요?

const sd = data.get("someDateData");
// sd가 무슨 의미일까요?

 

Good  →  변수명을 구체적으로 바꿔줌으로써 다른 개발자들도 이해하기가 수월함

if (selectedDay === DaysType.Day) { }
// t => selectedDay (선택한 요일)

const getSelectedMonth = (selectedDays: Days[]) =>
selectedDays.map((item: Days) => item.month());

// cbm => getSelectedMonth (선택한 Month 를 조회하는 함수)
// d => selectedDays (선택된 요일들)
// dd => item (selectedDays 구성요소)

const selectedDate = data.get("someDateData");
// sd => selectedDate (선택된 날짜)

 

2-2. 주석은 해결책이 아니다

Bad  → 주석을 써서 부족한 설명을 보완한다?

const t = " ";  // 유저가 선택한 날짜

Bad  → 주석이 쓰여있는 범위를 벗어난다면?

/**
* 이
* 후
* 다
* 른
* 코
* 드
* 들
* 이
* 나
* 온
* 다
* 음
* 에
*/

if (t === DaysType.Day) {
}
// t가 무슨 의미인지 확인하려면 t가 선언된 부분의 주석을 확인해야한다

- if 문에서 t를 읽은 개발자는 t가 어떤 의미인지 알 수 있을까?

 

Good  →  의미있고 구체적인 변수명으로 변경해주면 주석이 필요가 없음

좋은 코드일수록 주석이 필요 없음
const selectedDate = " ";


/**
* 이
* 후
* 다
* 른
* 코
* 드
* 들
* 이
* 나
* 온
* 다
* 음
* 에
*/


if (selectedDay === DaysType.Day) {
} // t => selectedDay

 

2-3. 중언부언 하지마라

Bad  → 일반적인 단어들의 조합으로 변수가 어떤 역할을 하는지 알 수 없음

const stringArray = // 댓글 목록

Good  →  대상의 특징을 명확하게 드러낼 수 있는 용어를 사용해야 함

const replyComments =

 

정리


작성자만 알수있는 약자를 사용하지 말자
주석을 덧대서 설명하기보다 구체적인 변수명을 사용하자
역할을 설명할수 있는 명확한 단어를 쓰자

 

 

 

 

 

 

무료 강의 - 인프런 클린코드 찍먹

https://www.inflearn.com/course/%ED%81%B4%EB%A6%B0%EC%BD%94%EB%93%9C-%EC%B0%8D%EB%A8%B9?srsltid=AfmBOopso_XjA6zK1Xl0KnHriY1ENTVTDZc7SQiSQxxZz4ZM9UTggDi2

반응형

'Cloud Engineering Bootcamp > 99. CleanCode' 카테고리의 다른 글

[udemy] 클린 코드  (0) 2025.08.06