|
| 1 | +--- |
| 2 | +title: "[Security] Secure Coding(6-1) - ORM" |
| 3 | + |
| 4 | +categories: [Security, Secure Coding] |
| 5 | +tags: |
| 6 | + - [Security, Cyberattacks, 보안, 시큐어 코딩, ORM, MyBatis] |
| 7 | +toc: true |
| 8 | +toc_sticky: true |
| 9 | + |
| 10 | +date: 2025-10-08 |
| 11 | +last_modified_at: 2025-10-08 |
| 12 | +--- |
| 13 | +>🔒 시큐어 코딩 수업 정리 |
| 14 | +
|
| 15 | +## ORM 프레임워크 |
| 16 | +📚**<span style="color: #008000">ORM</span>**: 객체 지향 언어의 객체와 관계형 데이터베이스의 테이블 간 데이터를 자동으로 매핑하는 기술 |
| 17 | + |
| 18 | +✅**ORM 필요성**: |
| 19 | +* **불일치 문제 해결**: 객체 모델과 스키마 간 불이치 해소 |
| 20 | +* **개발 생산성 향상**: SQL 직접 작성 부담 감소, 코드 간결화 |
| 21 | +* **유지보수성 및 보안 강화**: 데이터베이스 접근 추상화로 보안 취약점(예: SQL Injection) 최소화 |
| 22 | + |
| 23 | + |
| 24 | + |
| 25 | +### 전통적 SQL 쿼리 VS ORM 비교 |
| 26 | + |
| 27 | + |
| 28 | +> 각각 정의와 특징 비교 |
| 29 | +
|
| 30 | + |
| 31 | +> 장점과 단점 비교 |
| 32 | +
|
| 33 | +* **전통적 SQL 쿼리 방식이 적합한 경우** |
| 34 | + * 성능 튜닝이 중요한 경우 |
| 35 | + * 복잡한 다중 조인 쿼리 작성 시 |
| 36 | + * 특정 DBMS 고유 기능(예: 저장 프로시저, 윈도우 함수)을 적극 활용할 때 |
| 37 | + |
| 38 | +* **ORM 사용이 적합한 경우** |
| 39 | + * CRUD 중심의 애플리케이션, 빠른 프로토타이핑 및 유지보수가 중요한 경우 |
| 40 | + * 데이터베이스 독립성이 필요하거나 객체 지향 패러다임을 선호할 때 |
| 41 | + |
| 42 | +--- |
| 43 | + |
| 44 | +### ORM 주요 기능 |
| 45 | +1. **<span style="color: #008000">매핑 기능</span>** |
| 46 | +* **객체-테이블 매핑** |
| 47 | + * 클래스와 테이블, 필드와 컬럼을 자동 매핑 → SQL 작성 없이 데이터 조작 |
| 48 | +* **관계 매핑** |
| 49 | + * `1:1`, `1:N`, `N:M` 관계를 어노테이션 또는 XML 설정을 통해 정의 및 관리 |
| 50 | +* **자동 스키마 생성** |
| 51 | + * 도메인 모델 변경에 따라 DB 스키마를 자동 생성하거나 업데이트 가능 |
| 52 | + |
| 53 | +2. **<span style="color: #008000">CRUD 작업 지원</span>** |
| 54 | +* `Create`, `Read`, `Update`, `Delete` 기능을 **객체 조작**만으로 처리 |
| 55 | +* 데이터베이스 직접 접근 없이, **객체 상태 변경에 따른 자동 동기화**(`DIRTY CHECKING`) |
| 56 | + |
| 57 | +3. **<span style="color: #008000">고급 쿼리 기능</span>** |
| 58 | +* **객체 지향 쿼리 언어 (HQL, JPQL 등)** |
| 59 | + * SQL보다 **추상화된 방식**으로 데이터 조회 및 조작 가능 |
| 60 | +* **Criteria API** |
| 61 | + * 프로그래밍 방식으로 동적 쿼리 작성 지원 |
| 62 | +* **네이티브 쿼리 지원** |
| 63 | + * 필요시 직접 SQL을 실행할 수 있는 기능 제공 |
| 64 | + |
| 65 | +4. **<span style="color: #008000">Lazy Loading & 캐싱</span>** |
| 66 | +* **지연 로딩(Lazy Loading)** |
| 67 | + * 실제 사용 시점에 연관 데이터를 로드하여 초기 로딩 비용 절감 |
| 68 | +* **1차/2차 캐시** |
| 69 | + * 동일 세션(1차 캐시) 내, 애플리케이션 전역(2차 캐시)에서 캐시를 활용해 성능 최적화 |
| 70 | + |
| 71 | +5. **<span style="color: #008000">트랜잭션 관리</span>** |
| 72 | +* **자동 트랜잭션 처리** |
| 73 | + * 명시적 트랜잭션 없이, ORM 프레임워크가 트랜잭션 경계를 관리 |
| 74 | + * 일일히 커밋과 롤백 코드를 작성 안해도 됨 |
| 75 | +* **동시성 제어 및 낙관적/비관적 Lock 지원** |
| 76 | + * 데이터 무결성을 유지하며 여러 사용자의 동시 접근 처리 |
| 77 | + * **낙관적 Lock**: 데이터를 읽을 때 버전을 읽고 수정할 때 버전 번호 확인 → 버전이 다르면 다른 사람이 먼저 수정함, 즉 충돌! |
| 78 | + * **비관적 Lock**: 데이터를 읽을 때 DB에서 Lock을 걸고 수정, 작업 완료 후 Lock 해제 |
| 79 | + |
| 80 | +6. **기타 부가 기능** |
| 81 | +* **연관 관계 및 Fetch 전략** |
| 82 | + * 연관 객체 로딩 전략 설정으로 성능 및 메모리 최적화 |
| 83 | +* **유연한 설정 및 확장성** |
| 84 | + * XML, 어노테이션, 플러그인 등을 통한 다양한 설정 옵션과 확장성 제공 |
| 85 | + |
| 86 | +--- |
| 87 | + |
| 88 | +## MyBatis 프레임워크 활용 |
| 89 | +📚**<span style="color: #008000">MyBatis</span>**: Java Persistence 프레임워크로, **SQL 쿼리와 자바 객체 간의 매핑**을 지원 |
| 90 | +* 개발자가 직접 SQL을 작성한 후, **XML이나 어노테이션을 통해 매핑을 설정**하여 DB와 상호작용 |
| 91 | + |
| 92 | +✅**특징**: |
| 93 | +* 복잡한 쿼리와 최적화에 유리 |
| 94 | +* ORM의 추상화 없이 직접 SQL 작성으로만 세밀한 제어 가능 |
| 95 | +* XML, 어노테이션 등 다양한 방식으로 매핑 설정 가능 |
| 96 | + |
| 97 | +### MyBatis 주요 기능 |
| 98 | +1. **<span style="color: #008000">SQL 매핑 및 실행</span>** |
| 99 | +* Mapper 파일(`XML`) 또는 어노테이션 기반으로 SQL 문을 정의 |
| 100 | +* SQL 문과 자바 객체 간의 **자동 매핑 제공** |
| 101 | + |
| 102 | +2. **<span style="color: #008000">동적 SQL 지원</span>** |
| 103 | +* **조건문(<if>, <choose>) 및 반복문(<foreach>)**을 사용하여 유연한 쿼리 작성 가능 |
| 104 | + |
| 105 | + |
| 106 | + |
| 107 | +3. **<span style="color: #008000">타입 핸들러(Type Handler)</span>** |
| 108 | +* **자바 객체와 DB 데이터 간 변환**을 위한 사용자 정의 타입 핸들러 지원 |
| 109 | + |
| 110 | +4. **<span style="color: #008000">플러그인 기능</span>** |
| 111 | +* 인터셉터를 통해 쿼리 실행 전/후 로직을 확장하거나 커스터마이징 가능 |
| 112 | + |
| 113 | +--- |
| 114 | + |
| 115 | +### Mybatis 설정 및 구성 |
| 116 | + |
| 117 | +1. **<span style="color: #008000">설정 파일(mybatis-config.xml)</span>** |
| 118 | +* 환경(데이터소스, 트랜잭션 매니저 등) 설정 및 전역 옵션 구성 |
| 119 | + |
| 120 | + |
| 121 | + |
| 122 | +2. **<span style="color: #008000">Mapper 파일 구성</span>** |
| 123 | +* SQL 문과 매핑 정보를 담은 XML 파일 또는 어노테이션 사용 |
| 124 | +* 네임스페이스를 통해 Mapper를 구분하고 재사용성 향상 |
| 125 | + |
| 126 | + |
| 127 | + |
| 128 | +3. **<span style="color: #008000">데이터 소스 및 세션 관리</span>** |
| 129 | +* **DB 커넥션 풀**과 `SqlSessionFactory`를 이용해 세션 생성 및 관리 |
| 130 | +* 스프링과 연동 시, **스프링 부트 자동 설정 및 통합 활용** |
| 131 | + |
| 132 | +--- |
| 133 | + |
| 134 | +### Mybatis 장단점 및 사례 |
| 135 | +✅**장점:** |
| 136 | +* SQL을 직접 작성하므로, 복잡한 쿼리 및 성능 튜닝에 유리 |
| 137 | +* ORM보다 간단한 설정으로 데이터 매핑을 관리 |
| 138 | +* DB 작업의 전 과정을 개발자가 직접 관리 가능 |
| 139 | + |
| 140 | +❌**단점:** |
| 141 | +* 직접 SQL 작성 시, 비슷한 쿼리의 중복 관리 필요 |
| 142 | +* ORM처럼 완전한 객체 관계 자동 매핑은 제공하지 않음 |
| 143 | +* XML/어노테이션 매핑 파일 관리 및 동적 SQL 작성에 대한 학습 필요 |
| 144 | + |
| 145 | +💡**사용 사례**: |
| 146 | +* 대규모 데이터 처리, 복잡한 쿼리 최적화가 요구되는 애플리케이션 |
| 147 | +* 기존 JDBC의 반복 작업을 줄이면서도 세밀한 SQL 제어가 필요한 프로젝트 |
| 148 | + |
| 149 | +--- |
| 150 | + |
| 151 | +## ORM 사용 시 보안 이슈 |
| 152 | +* ORM의 역할 |
| 153 | + * 객체와 관계형 데이터베이스 간 매핑을 자동화하여 개발 생산성을 높임 |
| 154 | + * SQL을 직접 작성하지 않고도 CRUD 및 복잡한 쿼리 수행 가능 |
| 155 | + |
| 156 | +* **보안 이슈의 중요성** |
| 157 | + * ORM 자체가 `SQL Injection` 등을 기본적으로 방어하지만, 잘못된 사용 시 취약점이 발생할 수 있음 |
| 158 | + * 매핑, 캐싱, 동적 쿼리 등 여러 요소가 보안에 영향을 미칠 수 있음 |
| 159 | + |
| 160 | +### SQL Injection + 동적 쿼리 취약점 |
| 161 | + |
| 162 | +{:.prompt-warning} |
| 163 | +> 기본적인 ORM은 파라미터 바인딩으로 보호되지만, **동적 쿼리를 문자열 결합 방식으로 작성**하면 SQL 인젝션 발생할 수 있음 |
| 164 | +> |
| 165 | +
|
| 166 | +**→ Native Query 사용 시 주의 필요!** |
| 167 | + |
| 168 | +✅**대응 방안**: |
| 169 | +* 항상 안전한 파라미터 바인딩 방식을 사용해야 함 |
| 170 | +* 동적 쿼리 작성 시 - ORM이 제공하는 동적 SQL 태그(예: MyBatis의 `if`, `choose` 등) 사용 |
| 171 | +* Native Query 사용 시 별도 검증 및 파라미터 바인딩 철저 |
| 172 | + |
| 173 | +--- |
| 174 | + |
| 175 | +### 캐싱 및 지연 로딩 관련 보안 이슈 |
| 176 | +* **캐싱 취약점** |
| 177 | + * 2차 캐시나 공유 캐시 설정 시 민감 데이터가 의도치 않게 **노출될 가능성** |
| 178 | + * 캐시 무결성 관리 미흡 시, 캐시 변조 공격(`Cache Poisoning`) 위험 |
| 179 | + |
| 180 | +* **지연 로딩 및 데이터 노출** |
| 181 | + * 필요 이상으로 연관된 데이터가 지연 로딩되어, 예상치 못한 데이터 노출 발생 가능 |
| 182 | + * ORM 매핑 시 **민감 정보가 포함된 엔티티를 불필요하게 로드**하는 문제 |
| 183 | + |
| 184 | +✅**대응 방안**: |
| 185 | +* 캐시 설정 시 민감 데이터 제외 및 접근 제어 강화 |
| 186 | +* `Lazy Loading` 설정과 연관 데이터 조회 시 **필요한 데이터만 선택적으로 로드**하도록 설계 |
| 187 | + |
| 188 | +--- |
| 189 | + |
| 190 | +### 매핑, 설정 및 권한 관리 취약점 |
| 191 | +* **잘못된 매핑 설정** |
| 192 | + * 엔티티 매핑 오류로 인한 데이터 누락 또는 과도한 데이터 노출 |
| 193 | + * 양방향 매핑 및 연관 관계 설정 미흡 시, 무한 루프 또는 불필요한 데이터 로드 발생 |
| 194 | + |
| 195 | +* **Mass Assignment (대량 할당) 취약점** |
| 196 | + * 클라이언트 입력 값을 그대로 엔티티에 바인딩할 경우, 원치 않는 필드 변경 가능 |
| 197 | + |
| 198 | +✅**대응 방안**: |
| 199 | +* 엔티티 매핑 시 - 민감 필드는 **명시적으로 제외하거나 읽기 전용**으로 설정 |
| 200 | +* 입력값 검증과 DTO(Data Transfer Object)를 활용하여, 대량 할당 공격 방지 |
0 commit comments