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

+ Recent posts