250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 자료구조
- 스택 큐 차이
- java
- 정렬
- 클린
- 인터페이스
- 내부 정렬
- 빅 오 표기법
- 쿼리메소드
- mysql
- 트리
- 선형 리스트
- @ComponentScan
- 계산 검색 방식
- 클린코드
- 리스트
- @RequiredArgsConstructor
- 코드
- 클래스
- 연결 리스트
- query
- JsonNode
- 마크다운 테이블
- 쿠키
- CleanCode
- code
- 마크다운
- 배열
- WebClient
- @NoArgsConstructor
Archives
- Today
- Total
Developer Cafe
샾(#{})과 달러(${})의 차이 본문
728x90
1. #{} 를 사용하면
<select id="select" resultType="String" parameterType="Map">
SELECT
name AS name
FROM
user_#{tableId}
WHERE
id = #{id}
</select>
변수에 작은 따옴표(‘)가 자동으로 붙여 쿼리가 수행되기 때문에 '#{id}'와 같은 식으로 쿼리문을 작성하지 않아도 된다. 이러한 특성으로 테이블 설계가 user_1, user_2과 같이 분리되어 구성되어 있을 때, 위와 같은 식으로는 작성할 수 없다.
위 쿼리문이 수행되면 tableId 변수 양쪽에 따옴표가 붙기 때문에 SQLSyntaxErrorException 오류가 발생한다.
2. ${} 를 사용하면
값이 넣어진 채로 쿼리문이 수행된다. 그렇기 때문에 파라미터의 값이 바뀔 때마다 항상 쿼리문 파싱을 진행해야 한다. 즉, 성능상의 단점이 존재한다.
그리고 쿼리문에 #{}을 사용한 것과 다르게 작은 따옴표(‘)가 붙지 않기 때문에 아래처럼 테이블 이름이나 컬럼 이름을 동적으로 결정할 때 사용할 수 있다.
<select id="select" resultType="String" parameterType="Map">
SELECT
name AS name
FROM
user_${id}
WHERE
id = #{id}
</select>
달러(${})를 사용한 경우 SQL Injection에 취약한 점이 흠이다.
3. SQL Injection
<select id="selectUserFromTable" parameterType="Map" resultType="...">
SELECT
*
FROM
user
WHERE
id = '${id}' AND password = '${password}'
</select>
만일 id 파라미터의 값으로 admin' -- 이 입력되는 경우 어떻게 될까? 실제 파싱되는 쿼리문은 아래와 같을 것이다.
SELECT
*
FROM
user
WHERE
id = 'admin' -- 'AND password = ''
즉, where 절에서 비밀번호에 대한 조건은 사라지게 되어 id만 입력해도 관리자 계정 정보를 조회할 수 있게 된다. 이처럼 ${}를 사용하게 되는 경우 #{}을 사용하는 것보다 SQL Injection에 취약하다.
4. 결론
웬만하면 보안적인 이슈로 인해 #{}을 사용하자
728x90
Comments