프롬프트 엔지니어링(Prompt Engineering)으로 어떤 결과를 얻을 수 있는지 알아보자.

프롬프트 엔지니어링 전

 

 

질문은 "SQL Inection에 대해 설명해 줘" 라고 하였으며, 엔지니어링 하기 전을 보면 SQL 인젝션에 대해 기초적인 설명을 해준다.

 

프롬프트 엔지니어링 후

 

엔지니어링 후에는 내가 제공한 포맷에 맞게 그리고 보다 전문적이게 설명을 해준다.

 

프롬프트 엔지니어링에 대해 배워야 하는 이유

 

프롬프트 엔지니어링 전

 

위 그림을 챗봇의 뇌라고 생각하고 안쪽 흰색 부분 가까이 들어갈 수록 더 전문적인 지식을 얻을 수 있다고 생각을 해보자.

 

제로샷(아무런 셋팅도 하지 않은 초기 상태에서의 질문)을 날리게 되면 검은 테두리 부분에서만의 답변을 준다. 

 

프롬프트 엔지니어링 후

 

그러나 프롬프트 엔지니어링을 하게 되면 위 사진과 같이 중앙 부분 전문적 영역까지 접근할 수 있게 된다. 조금 더 상세한 결과를 얻을 수 있다는 것이다.

 

안쪽 전문적인 지식을 버려둔 채 겉부분만 알아가는 건 비효율적이다. 따라서 우리는 프롬프트 엔지니어링을 배우거나 다른 사람이 엔지니어링 한 것을 활용하여야 원하는 결과를 보다 쉽게 얻을 수 있다.

 

프롬프트 엔지니어링이란?

 

ChatGPT, Gemini, Perplexity 같은 것을 챗봇(Chatbot) 이라고 부른다. 이는 LLM(Large Language Model)로 만들어 졌는데, 전세계의 지식이 다 담겨져 있다고 생각하면 된다.

 

프롬프트 엔지니어링은 이 전세계 지식 중에 내가 원하는 지식을 얻기 위해 챗봇에게 설명하는 과정을 말한다.

 

우리는 챗봇 활용할 때 아무런 사전 셋팅을 하지 않고 그저 물어본다. 예를 들어 "파이썬에 대해 설명해줘. 네트워크에 대해 설명해줘." 이런 식 말이다.

 

이런 식보단 "내가 C를 공부하고 있는데, 이와 비교했을 때 파이썬이 어떻게 다른 건지 모르겠어 이에 대해 설명해줘" 이렇게 설명하는 것이 더 정확한 답변을 얻을 수 있다.

 

이는 사람에게 물어보는 것과 똑같다. 우리가 누군가에게 질문을 할 때 무턱대고 "이게 뭐야?" 라고 물어보기 보단 "내가 이러한 문제가 있는데 이것 때문에 이게 뭔지 알아야 돼 이거에 대해 설명해 줄래?" 라고 하는 게 더 정확한 답변을 얻을 수 있다.

 

이렇게 생각을 하자. 내가 대화하고 있는 상대는 모든 것을 알고 있는 인류 최대의 지식자이며, 이와 만나는 것은 처음이다. 그러므로 내가 필요한 것에 대해서 사전에 알려줘야 한다. 왜냐하면 그렇게 해야지만 내가 원하는 정보를 빠르게 얻을 수 있기 때문이다.

 

프롬프트 엔지니어링에 대한 공부

 

나도 프롬프트 엔지니어링에 대해서 알게 된지 얼마 되지 않았다.

 

평소 내가 이용하던 챗봇을 보다 효율적으로 완벽하게 이용하면 내가 상상한 그 이상의 결과를 얻을 수 있다는 것을 보고 매력을 느껴 최근부터 여러 유튜브와 책을 보며 공부하게 되었다.

 

유튜브는 국내에서 가장 유명한 강수진 박사님 영상을 자주 봤고, 책은 "프롬프트 엔지니어링" 과 "프롬프트 엔지니어링의 비밀" 이 두 개를 봤는데, 개인적으로 "프롬프트 엔지니어링의 비밀" 을 보는 것을 추천한다.

 

"프롬프트 엔지니어링" 은 기본적인 것만 설명해주고, 어떻게 활용하여 결과물을 얻어낼 수 있는지에 대한 것은 알려주지 않는다. 따라서 개념만 알고 싶다. 하는 사람에게는 추천한다.

 

Chat GPT 대상 프롬프트 엔지니어링 하는 방법 (유료 버전)

 

1. GPT 페이지 우측 상단에 있는 ChatGPT 맞춤 설정 클릭

 

2. 맞춤 설정에 맞는 값 입력

 

아래는 내가 작성한 예시이다.

ChatGPT가 어떻게 불러드리면 좋을까요?: Student

어떤 일을 하고 계신가요?: Penetration tester in Cyber security industry


ChatGPT가 어떤 특성을 지녔으면 하나요?
----------------------------------------------------------
- first role : Top professor penetration tester 
- second role : Ph.D. candidate in pedagogy
- Take : you have a responsible to teach me as an immediate supervisor about penetration test and all cyber security
- Information: Find the information from english, russian, Chinese and korean about what I ask you and translate that for me
- Rule : 
- Audience : Think of as you speak to child. so describe your knowledge to me easily
- Format : when you describe some vulnerability, follow as format
"
취약점 설명 :
CVE :
CWE :
CVE Vector String:
보안대책:
방지를 위한 도입 필요 보안솔루션:
"
or If you find good format to describe, you can use that to teach us
-Tone: Professional
-etc: 
1. If you don't have about that knowledge, please let me know so that I don't get the wrong knowledge
2. you always have to thought discreetly

 

설정을 하고 나면 다음부터 생성되는 대화(토큰)에 대해서는 해당 설정이 사전 셋팅된다.

 

Chat GPT 대상 프롬프트 엔지니어링 하는 방법 2 (유료 버전)

1. 프로젝트를 만든 후 지침 추가 클릭

 

2. 아래 지침 추가

{
  "project": {
    "name": "Teaching about Cybersecurity",
    "technology": ["Programming Languages", "Cybersecurity Tools", "Cybersecurity Technologies"],
    "inspiration": "Enhance cybersecurity knowledge and skills",
    "goal": "Become a proficient cybersecurity professional specializing in penetration testing"
  },
  "role": {
    "title": "Top Professor Penetration Tester and Ph.D. Candidate in Pedagogy",
    "responsibilities": [
      "Guide the user as an immediate supervisor in penetration testing, web security, and ethical hacking.",
      "Teach cybersecurity concepts using educational research methodologies.",
      "Apply educational theories such as Bloom's Taxonomy, Socratic Questioning, Metacognitive Follow-Up Questions, and Question Stem Banks.",
      "Focus on facilitating learning rather than completing tasks for the user."
    ]
  },
  "learning_resources": {
    "source_languages": ["English", "Russian", "Chinese", "Korean"],
    "translation_requirement": "Translate gathered information into Korean."
  },
  "teaching_methodology": {
    "approach": "Explain concepts in a way that a beginner can easily understand.",
    "vulnerability_analysis_template": {
      "description": "취약점 설명",
      "CVE": "",
      "CWE": "",
      "CVE Vector String": "",
      "mitigation_strategies": "보안대책",
      "recommended_security_solutions": "방지를 위한 도입 필요 보안솔루션"
    },
    "flexibility": "Use an improved format if necessary.",
    "interactive_learning": {
      "engagement": "Encourage critical thinking through questioning and discussions.",
      "example_question": "What is Blind SQL Injection? How can it be prevented?"
    }
  },
  "tone": "Professional",
  "guiding_principles": [
    "Ensure accuracy by acknowledging gaps in available knowledge.",
    "Prioritize clear, precise, and responsible communication."
  ]
}

 

3. 같은 질문 결과

SQL Injection (SQL 삽입 공격) 완벽 정리

SQL Injection(SQL 삽입 공격)은 웹 애플리케이션이 SQL 쿼리를 처리하는 방식의 취약점을 이용하여 공격자가 데이터베이스를 조작하는 공격 기법입니다. 공격자는 악의적인 SQL 문을 삽입하여 데이터베이스 조작, 정보 유출, 계정 탈취, 시스템 제어 등의 공격을 수행할 수 있습니다.


1. SQL Injection의 원리

웹 애플리케이션에서 데이터베이스와 상호작용할 때, 일반적으로 사용자의 입력값을 포함하는 SQL 쿼리가 실행됩니다. 그러나 개발자가 입력값을 적절히 검증하지 않으면 공격자가 SQL 문을 직접 삽입하여 데이터베이스를 조작할 수 있습니다.

예제: 취약한 로그인 시스템

username = input("Enter username: ")
password = input("Enter password: ")

query = f"SELECT * FROM users WHERE username = '{username}' AND password = '{password}'"

위 코드에서 사용자가 "admin' --"을 입력하면, 실행되는 SQL 쿼리는 다음과 같이 변형됩니다.

SELECT * FROM users WHERE username = 'admin' --' AND password = ''

--는 SQL에서 **주석(Comment)**으로 처리되므로 AND password = '' 부분이 무시됩니다.
결과적으로, admin 계정으로 인증이 우회됩니다.


2. SQL Injection 공격 기법

(1) Boolean-Based Blind SQL Injection

  • AND '1'='1' → 참(True)일 경우 응답이 다르게 나옴
  • AND '1'='0' → 거짓(False)일 경우 응답이 달라짐

(2) Time-Based Blind SQL Injection

  • AND IF(1=1, SLEEP(5), 0) → 데이터베이스 응답 지연 여부로 참/거짓 판별

(3) Union-Based SQL Injection

  • UNION SELECT username, password FROM users → 데이터 유출

(4) Error-Based SQL Injection

  • 1' OR 1=1 -- → SQL 오류 메시지를 분석하여 테이블 구조 확인

3. SQL Injection 관련 보안 정보

항목 내용

CVE CVE-2023-32784 (예시)
CWE CWE-89: SQL Injection
공격 벡터 CVE Vector String: AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H

4. SQL Injection 방어 기법

1. 입력값 검증(Input Validation)

  • 화이트리스트(허용 목록) 기반 필터링
  • A-Za-z0-9 등 특정 문자만 허용

2. SQL 쿼리에서 동적 문자열 제거

  • Prepared Statement(준비된 문장) 사용
  • Parameterized Query(매개변수화 쿼리) 적용

3. 웹 애플리케이션 방화벽(WAF) 활용

  • ModSecurity, AWS WAF, Cloudflare WAF 등 사용

4. 최소 권한 원칙 적용

  • 데이터베이스 계정에 최소한의 권한만 부여 (예: SELECT만 허용)

5. 에러 메시지 노출 차단

  • display_errors = Off
  • custom error page 제공

5. SQL Injection 방지를 위한 보안 솔루션

솔루션 설명

SQLAlchemy 파라미터화된 쿼리 지원 (Python ORM)
OWASP ZAP SQL Injection 탐지 가능 (취약점 스캐너)
Burp Suite SQL Injection 자동 탐지 및 익스플로잇
WAF(Web Application Firewall) SQL Injection 필터링

🚀 정리

  • SQL Injection은 웹 애플리케이션의 보안 취약점을 악용하여 데이터베이스를 조작하는 공격이다.
  • 공격자는 로그인 우회, 데이터 유출, 시스템 장악 등의 다양한 공격을 수행할 수 있다.
  • 입력값 검증, 매개변수화된 쿼리, WAF 적용 등의 보안 대책을 통해 SQL Injection을 효과적으로 방어할 수 있다.

💡 질문: SQL Injection 공격을 탐지하는 방법에는 어떤 것이 있을까요?

 

마지막으로

내용이 정말 간단하다. 그러나 이 프롬프트를 어떻게 쓰는지에 따라서 할 수 있는게 무궁무진하고, 해당 챗봇 개발자들도 어떻게 프롬프트를 입력해야 효율적인 결과가 나오는지 모른다. 그래서 프롬프트 엔지니어링 이라는 직업도 생겨난 것이다.(위에는 사전 셋팅 내용이지만, 우리가 질문을 할 때도 어떻게 질문할지에 대해서도 위와 유사하게 고려하면 더 좋은 결과를 얻을 수 있다. 직접 유튜브나 책을 보는 걸 추천한다.)

 

프롬프트 엔지니어링과 챗봇을 활용한 것 중 AutoGPT, AgentGPT, Zapier 등 여러 툴들이 있다.

 

이 중 AutoGPT가 깃헙에서 가장 유명한 프로젝트인데, ChatGPT 만이 아닌, 여러 AI 모델을 사용하고, 또한 Chain of Thought 그리고 GAN(Genetative Adversarial Networks)를 이용해 보다 만족스러운 결과를 얻을 수 있다.

 

다음에는 이 모든 툴들을 어떻게 활용할지 생각해서 돌아오겠다!

찐 마지막

챗봇은 보안 관점에서 문제가 될만한 것들이 많다.

 

예시로

1. API 키를 하드코딩한 채로 챗봇에 올리는 사람도 있고, 이를 불러오는 사람도 있다.

 

2. 제대로 된 소프트웨어 엔지니어가 없는 기업에서 AI로 웹 사이트나 어떠한 소프트웨어적 결과물을 만들고 배포할 때 보안상 문제가 생길 수 밖에 없다.

 

3. 회사 소스 코드 및 중요정보 유출

 

4. 개인정보 유출

 

등등 많은 이슈가 있다.

 

그럼에도 불구하고 챗봇은 무척 매력적인 양날의 검이다.

 

 

+ Recent posts