728x90
선배한테 물어보면 10명중 8명은 아래와 같이 설명해 줄꺼다!
선배1 : #{} 은 보안에 좋고 ${} 보안엔 안좋고...그래서 보안에 좋은 #{} 를 써고 ${}은 쓰지말라고
선배2 : innjection 어쩌고 저쩌고...
뭐 보안에 대해서 언급했으니 그 선배한테는 일단 50점을 준다. 하지만 보안에 좋으니 #{} 을 쓰고 ${}를 쓰지 말라는 얘기는 틀린 말이다.
왜냐면 2가지 모두 사용해도 문제 없다,하지만 용도가 틀리니 구분해서 사용해야 된다는것이다.
차이
1. #{ }는 수신 데이터를 문자열로 취급하고 수신 데이터에 큰따옴표를 추가한다.
select * from student where student_name = #{studentName}
전달된 값이 "blake" 이면 sql로 구문 분석된 값은 student_name="blake" 으로 된다.
2. ${ }는 SQL에서 들어오는 데이터를 직접 표시하고 생성한다.
select ${fieldNmae} from student where student_age = 18
이때 전달된 파라미터는 질의할 필드로 사용되며 전달된 값이 student_name인 경우 구문 분석된 SQL은 다음과 같다.
select student_name from student where age = 18
3. #{ } 메소드는 SQL injection 방지할수 있다.
4. ${ }는 SQL 삽입(injection)을 방지할 수 없다.
5. ${ } 메서드는 일반적으로 목록 및 테이블 이름과 같은 데이터베이스 개체를 전달하는 데 사용
6. #{ } 메서드는 보안선이 높으므로 #{}를 사용할 수 있는 곳에 ${ }를 사용하지 않도록 한다.
7. Mybatis 에서 정렬할 때 동적 매개변수에 의한 순서 order by 를 사용할때 #{ } 대신 ${ }를 사용한다.
계속해서 아래 코드를 보자
select * from student where name = #{name}
select * from student where name = ${name}
쿼리 분석된 결과는 동일하게
select * from student where name = "blake"
라고 나올것이다.
#{}와 ${}의 차이점은 사전 컴파일 처리에 있다.
#{} 사는 컴파일 단계에서 매개변수 부분을 다음 SQL 문이 되는 자리 표시자 ?로 대체 된다.
select * from student where name = "blake"
그리고 삽입관련 내용은 내가 예전에 작성한 injection 관련 포스팅을 참고하면 도움될것 같다!
끝!
'Back-end' 카테고리의 다른 글
StringUtil 이제 안녕! (0) | 2023.04.25 |
---|---|
SQL Injection 에대해서 (0) | 2023.01.20 |
mybtis 에서 where 1=1 ? 그냥 쓰지마! (0) | 2023.01.20 |
Springboot 3가지 CROS 설정 (0) | 2023.01.09 |
Apache BeanUtils vs Spring BeanUtils 성능비교 (0) | 2023.01.06 |