[UMC] SQL 쿼리 작성 및 분석해보기

easyone·2025년 3월 26일

UMC

목록 보기
3/6
  1. (내가 진행중, 진행 완료한 미션 모아서 보는 쿼리(페이징 포함))에서 정렬 기준을 1순위는 포인트로 2순위는 최신순으로 하여 Cursor기반 페이지네이션을 구현해보세요
SELECT m.content, m.point, u.status, m.store_id
FROM (
    SELECT * FROM user_missions
    WHERE status IN ('SUCCESS', 'PROGRESS')
) u
JOIN (
    SELECT mission_id, content, point, store_id FROM missions
) m ON u.mission_id = m.mission_id
WHERE (u.start_at, u.mission_id) > (#{cursorStartAt}, #{cursorMissionId})
ORDER BY m.point DESC ,u.start_at DESC
LIMIT #{size};
  1. SQL Injection에 대해 조사하고 어떠할 때 일어나고 어떻게 막을 수 있는 지를 적어주세요

SQL Injection은 사용자가 데이터를 입력하는 부분에서, 유효성을 검사하지 못하는 부분을 활용하여 데이터베이스에 접근하기 위한 SQL 명령을 악의적으로 전달하는 것이다. 데이터베이스 권한을 획득하거나, 정보를 직접 검색함으로써 사용자의 데이터를 무단 침해할 수 있다.

사용자의 정보를 입력하는 로그인 부분을 예로 들어 볼 수 있다.
username, password를 입력하고 로그인 버튼을 클릭하면 실행되는 쿼리를 다음과 같이 작성할 수 있다.

"SELECT Count(*) FROM WHERE username =' " + txt.User.Text+" ' AND Password=' " + txt.Password.Text+" ' ";

사용자 이름을 admin으로
입력한 유저가 존재하는지 확인하는 쿼리이다. 해커들은 Magical String이라는 문자열을 사용해서 접근 권한을 획득한다.

"SELECT Count(*) FROM Users WHERE Username=' admin ' AND Password=' anything 'or'1'='1 ' ";

1=1이 항상 true이기 때문에 admin 권한을 얻을 수 있다.

  1. 다양한 JOIN 방법들에 대해 찾아보고, 각 방식에 대해 비교하여 간단히 정리해주세요.
JOIN 종류설명결과 예시
INNER JOIN두 테이블에서 일치하는 값만 반환A와 B 테이블 모두에 존재하는 공통된 행만 보여줌
LEFT JOIN왼쪽 테이블의 모든 행과, 오른쪽 테이블에서 일치하는 값 반환왼쪽 테이블에 있는 데이터는 모두 보이고, 오른쪽 테이블에 없으면 NULL로 채움
RIGHT JOIN오른쪽 테이블의 모든 행과, 왼쪽 테이블에서 일치하는 값 반환오른쪽 테이블 데이터는 모두 보이고, 왼쪽 테이블에 없으면 NULL로 채움
FULL JOIN양쪽 테이블의 모든 행 반환, 일치하지 않는 행은 NULL로 채움INNER + LEFT + RIGHT 조합, 양쪽 모두 포함
CROSS JOIN두 테이블의 모든 조합(곱집합) 반환
profile
백엔드 개발자 지망 대학생

0개의 댓글