개발자 기술면접 꼬리물기 질문
  • Welcome
  • 01 Java
    • 01-01. Generic
    • Garbage Collection
    • 자료형과 객체 비교
    • 힙(Heap)과 메모리(Memory)
    • JDK 버전과 JRE
    • 스레드(Thread)
    • 예외(Throwable)
    • Call By Value와 Call By Reference
    • String, equals, StringBuffer
    • Thread와 비동기
  • 02 Spring
    • 02-01. Spring 동작 방식
    • @Autowired, @RequiredArgsConstructor
    • 인증(Authentication)과 인가(Authorization)
    • 트랜잭션(Transaction)
    • QueryDSL과 SQL Injection
    • SecurityContextHolder
    • @EqualsAndHashCode
  • 알고리즘과 자료구조
    • Set 자료구조
    • 정렬 알고리즘
    • 우선순위 큐 (Priority Queue)
    • DFS와 BFS
    • 힙(Heap) 자료구조
    • 스택(Stack)과 큐(Queue)
    • 암호화 알고리즘
    • LinkedList
    • 자료구조 - 해시 테이블(HashTable)
    • 자료구조 - ConcurrentHashMap
  • 데이터베이스
    • 기본
    • 인덱스 (Index)
    • 정규화 (Normalization)
    • 파티셔닝과 샤딩(Partitioning & Sharding)
    • 트랜잭션(Transaction)과 락(Lock)
    • 덤프(Dump)
    • Redis
    • 격리 수준(MySQL)
  • 네트워크
    • 전송 계층 (Transport Layer)
    • 네트워크 계층 (Network Layer)
    • Http와 Https
    • IP(Internet Protocol)
    • 프록시 서버
    • Http Protocol
    • 소켓(Socket)
    • 로드 밸런싱(Load Balancing)
  • 디자인 패턴
    • 전략 패턴 (Strategy Pattern)
    • 싱글톤 패턴 (Singleton Pattern)
    • 템플릿 메서드 패턴과 전략 패턴
    • 데코레이터 패턴 (Decorator pattern)
  • 웹
    • CORS 정책
    • 동시성 제어
    • N+1 문제
    • 웹 브라우저 동작원리
    • URI, URL, URN
    • 채팅 아키텍처 설계
  • 개발자
    • 개발 방법론 TDD
  • 운영체제
    • JIT & AOT 컴파일
    • 컨텍스트 스위칭(Context Switching)
    • 프로세스와 스레드
    • 싱글 스레드와 멀티 스레드
  • 코딩테스트
    • Stack / Queue (스택 / 큐)
    • Heap(우선 순위 큐)
    • DP(동적 계획법)
    • DFS(깊이 우선 탐색)
    • BFS(너비 우선 탐색)
    • Greedy(그리디 알고리즘)
    • 해시(Hash)
    • 투 포인터 알고리즘
    • Shortest path
    • 수학적 사고
Powered by GitBook
On this page
  • Q. SQL Injection 공격의 대표적인 패턴에는 어떤 것들이 있나요?
  • Q. QueryDSL을 사용하면 SQL Injection 공격에 대해 안전할까요? 그렇다면 그 이유는 무엇인가요?
  • Q. Prepared Statement가 뭔가요?
  1. 02 Spring

QueryDSL과 SQL Injection

Q. SQL Injection 공격의 대표적인 패턴에는 어떤 것들이 있나요?

SQL Injection의 대표적인 공격 패턴들이 있습니다. 첫번째로 항상 참이 되는 조건을 주입하는 Tautology Attack이 있습니다. 예를 들어 '1'='1' 과 같은 조건문을 입주입한다면 항상 참이므로 모든 사용자 정보가 노출 될 수 있씁니다. 두번째로 Union 기반 공격과 중첩 쿼리가 있습니다. 새로운 SQL문을 작성해서 Union으로 연결하거나 AND로 묶어서 조회한다면 다른 테이블의 정보를 조회할 수 있습니다.

Q. QueryDSL을 사용하면 SQL Injection 공격에 대해 안전할까요? 그렇다면 그 이유는 무엇인가요?

스프링의 QueryDSL을 쓴다면 대체적으로 SQL Injection 공격으로부터 안전합니다. 여러 이유 중 가장 큰 이유로 Prepared Statement가 있습니다. QueryDSL은 파라미터 바인딩을 자동으로 처리합니다. 사용자가 입력한 값을 직접 쿼리문에 결합하는 것이 아니라, 준비된 statement를 사용해서 파라미터를 안전하게 연결합니다. 또한 QueryDSL은 타입 세이프한 방식으로 쿼리를 작성하기 때문에 컴파일 시점에 타입이 체크되므로, 악의적인 문자열이 쿼리에 직접 삽입도리 가능성을 차단하고, 내부적으로 escape 처리를 자동으로 수행해서 특수문자나 위험할 수 있는 문자들을 자동으로 이스케이프 처리해서 안전하게 처리합니다.

Q. Prepared Statement가 뭔가요?

Prepared Statement는 SQL 쿼리의 템플릿을 미리 만들어두고, 실행 시점에 파라미터 값만 바인딩하는 방식입니다. 예를들어 "SELECT * FROM users WHERE name = ' + name + "'"; 가 있다고 가정했을 때, name에 악의적인 값이나 코드가 들어올 경우 SQL Injection 공격이 가능해집니다. Prepared Statement는 이런 공격에 방어하기위해 파라미터가 문자열로 처리되어 쿼리문의 구조를 변경할 수 없습니다. 또한, 부가적인 장점으로 쿼리문과 파라미터가 분리되어 있어 코드의 이해도가 증가합니다. 이러한 이유로 Preapred Statement는 ORM같은 현대 데이터베이스 프로그래밍에서 널리 사용되는 표준적인 방식입니다.

Previous트랜잭션(Transaction)NextSecurityContextHolder

Last updated 6 months ago