티스토리 뷰

개발자교육

24_07_16 오늘의 수업내용

regnator 2024. 7. 19. 15:52
728x90
반응형

로그인 상태를 확인하기 위한 장치 (세션)

세션 소멸 방법

  • 특정 메서드로 소멸
  • 시간을 정해 자동 소멸 (어플리케이션에서 실행)

세션 유지 이유

  • 로그인 후 여러 활동을 해도 로그인이 풀리지 않도록 세션에서 처리

세션 설정 및 값 저장 (JSP 코드)

<%
  session.setAttribute("S_ID", dbid); // 변수: S_ID, 값: dbid
  session.setAttribute("S_LEVEL", dblevel); // 변수: S_LEVEL, 값: dblevel
  session.setAttribute("S_NAME", dbname); // 변수: S_NAME, 값: dbname
  response.sendRedirect(request.getContextPath() + "/index.jsp"); // 제어 흐름을 index.jsp로 이동
%>

 

세션 값 가져오기 (JSP 코드)

<%
  String S_ID = (String) session.getAttribute("S_ID");
  String S_LEVEL = (String) session.getAttribute("S_LEVEL");
  String S_NAME = (String) session.getAttribute("S_NAME");

  System.out.println(S_ID + "<--- S_ID");
  System.out.println(S_LEVEL + "<--- S_LEVEL");
  System.out.println(S_NAME + "<--- S_NAME");
%>

 

로그아웃 페이지 (JSP 코드)

<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<%
  // 세션 종료
  session.invalidate();
%>
<script type="text/javascript">
  alert('로그아웃');
  location.href='<%=request.getContextPath()%>/index.jsp';
</script>

 

데이터베이스 연동 - JDBC(Java data base connectivity)

1. 데이터베이스

1) DB 생성:

CREATE DATABASE dev52db DEFAULT CHARACTER SET UTF8;

 

2) 사용자 추가 및 권한 설정:

CREATE USER 'dev52id'@'%' IDENTIFIED BY 'dev52pw';
GRANT ALL PRIVILEGES ON dev52db.* TO 'dev52id'@'%';
FLUSH PRIVILEGES;
 

2. JSP 설정 및 데이터베이스 작업

JSP 페이지 설정

<%@ page language="java" contentType="text/html; charset=EUC-KR"

pageEncoding="EUC-KR"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<%@ page import="java.sql.DriverManager"%>

<%@ page import="java.sql.Connection"%>

<%@ page import="java.sql.PreparedStatement"%>

<%@ page import="java.sql.SQLException"%>

 

주요 코드 부분

1. 요청 인코딩 설정:

request.setCharacterEncoding("euc-kr");
  • 클라이언트가 보낸 데이터의 문자 인코딩(EUK-KR)을 설정합니다.

2. 입력 데이터 받기:

String m_id = request.getParameter("m_id");
String m_pw = request.getParameter("m_pw");
String m_level = request.getParameter("m_level");
String m_name = request.getParameter("m_name");
String m_email = request.getParameter("m_email");

System.out.println(m_id + "<-- m_id /minsert/m_insert_pro.jsp");
System.out.println(m_pw + "<-- m_pw /minsert/m_insert_pro.jsp");
System.out.println(m_level + "<-- m_level /minsert/m_insert_pro.jsp");
System.out.println(m_name + "<-- m_name /minsert/m_insert_pro.jsp");
System.out.println(m_email + "<-- m_email /minsert/m_insert_pro.jsp");
  • 웹 폼에서 사용자가 입력한 데이터를 받아 변수에 저장하고, 서버 콘솔에 출력하여 확인.

3. JDBC 프로그램 순서 7단계:

01단계: 드라이버 로딩
Class.forName("com.mysql.jdbc.Driver");
  • MySQL JDBC 드라이버를 로드하여 JDBC를 통해 MySQL 데이터베이스와 통신할 수 있게 한다.

드라이브 로드를 위해 사전 WEB-INF>lib에 라이브러리파일을 복사한다

 

02단계: Connection 객체로 DB 연결

String jdbcDriver = "jdbc:mysql://localhost:3306/dev52db?useUnicode=true&characterEncoding=euckr";
String dbUser = "dev52id";
String dbPass = "dev52pw";
conn = DriverManager.getConnection(jdbcDriver, dbUser, dbPass);
  • "jdbc:mysql://": 이 부분은 JDBC(Java Database Connectivity) 프로토콜을 사용하여 MySQL 데이터베이스에 연결하겠다는 것을 나타낸다.
  • "localhost:3306": MySQL 서버가 실행 중인 호스트와 포트 번호를 지정한다. 여기서 localhost는 데이터베이스 서버가 로컬 머신에서 실행되고 있음을 의미하며, 3306은 MySQL의 기본 포트 번호.
  • "dev52db": 연결할 데이터베이스의 이름.
  • "useUnicode=true&characterEncoding=euckr": 이 부분은 연결 시 유니코드를 사용하고, 데이터베이스와의 문자 인코딩을 euc-kr로 설정하겠다는 것을 의미. 이는 한국어 문자를 제대로 처리하기 위함.
  • 데이터베이스 URL, 사용자 이름 및 비밀번호를 사용하여 데이터베이스에 연결.

 

03단계: Query 실행을 위한 준비

pstmt = conn.prepareStatement("INSERT INTO tb_member VALUES (?, ?, ?, ?, ?)");
pstmt.setString(1, m_id);
pstmt.setString(2, m_pw);
pstmt.setString(3, m_level);
pstmt.setString(4, m_name);
pstmt.setString(5, m_email);
  • SQL INSERT 문을 미리 컴파일하여 pstmt 객체를 생성하고, 각 위치에 입력받은 데이터를 설정.
  • conn.prepareStatement 메서드를 사용하여 SQL INSERT 문을 미리 컴파일된 PreparedStatement 객체를 생성.
  • "INSERT INTO tb_member VALUES (?, ?, ?, ?, ?)"는 SQL INSERT 문으로, ?는 SQL 매개변수(placeholder).
  • 이 매개변수들은 나중에 실제 값으로 채워진다.
  • 이 방법은 SQL 인젝션 공격을 방지(아래서술)하고, 성능을 최적화하는 데 도움이 된다.
  • pstmt.setString(1, m_id);는 SQL 문에서 첫 번째 ?를 m_id 변수의 값으로 설정.
  • setString 메서드는 PreparedStatement 객체의 특정 위치에 문자열 데이터를 설정하는 메서드.
  • 각 setString 메서드는 ?를 순서대로 매핑. 여기서 숫자 1은 첫 번째 매개변수 위치를 의미하며, m_id는 설정할 값.

04단계: Query 실행

int result = pstmt.executeUpdate();
System.out.println(result + "<-- result");
  • SQL 문을 실행하여 데이터를 데이터베이스에 삽입하고, 실행 결과를 출력.
  • SQL INSERT/UPDATE/DELETE 문에서는 executeUdate메서드를 사용하지만, SELECT는 executeQuery문 사용

05단계: Query 실행 결과 사용

  • 이 단계는 INSERT, UPDATE, DELETE의 경우 생략 가능하지만, 결과를 확인하는 것이 중요.

06단계: statement 또는 PreparedStatement 객체 종료

if (pstmt != null) try { pstmt.close(); } catch (SQLException ex) { }
  • 사용한 pstmt 객체를 닫아 자원을 해제.

07단계: DB 연결(Connection 객체) 종료

if (conn != null) try { conn.close(); } catch (SQLException ex) { }
  • 데이터베이스 연결을 닫아 자원을 해제합니다.

 

SQL 인젝션 공격

SQL 인젝션(SQL Injection) 공격은 웹 애플리케이션에서 발생할 수 있는 보안 취약점 중 하나로, 공격자가 애플리케이션의 데이터베이스 쿼리를 조작하여 비정상적인 동작을 유도하거나, 민감한 정보를 탈취하거나, 데이터베이스를 손상시킬 수 있는 공격 기법.

SQL 인젝션 공격의 원리

공격자는 입력 필드(예: 로그인 폼, 검색 창 등)에 SQL 구문을 삽입하여, 애플리케이션이 예상하지 못한 SQL 쿼리를 실행하도록 유도. 

 
SELECT * FROM users WHERE username = 'user' AND password = 'password';
  • 위 쿼리에서 username과 password 값이 사용자의 입력으로 채워진다고 가정하자. 만약 공격자가 username 필드에 ' OR '1'='1를 입력하면, 최종 쿼리는 다음과 같이 변형될 수 있다:
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = 'password';
  • 이 쿼리는 항상 참(true)을 반환하므로, 공격자는 비밀번호를 알지 못하더라도 데이터베이스에 접근할 수 있게 된다.

SQL 인젝션 공격의 위험성

  1. 데이터 유출: 공격자는 민감한 정보를 탈취할 수 있다.
  2. 데이터 변경 및 삭제: 공격자는 데이터를 변경하거나 삭제할 수 있다.
  3. 인증 우회: 공격자는 인증 절차를 우회하여 시스템에 접근할 수 있다.
  4. 명령어 실행: 심각한 경우, 공격자는 데이터베이스 서버에서 시스템 명령어를 실행할 수 있다.

SQL 인젝션 공격 방어 방법

SQL 인젝션 공격을 방어하기 위해 다음과 같은 방법들을 사용할 수 있다:

1. PreparedStatement 사용:

PreparedStatement를 사용하여 SQL 쿼리를 미리 컴파일하면, 매개변수를 안전하게 처리할 수 있다.

PreparedStatement pstmt 
= conn.prepareStatement("SELECT * FROM users WHERE username = ? AND password = ?");
pstmt.setString(1, username);
pstmt.setString(2, password);
 
 

2. 입력값 검증:

  • 사용자로부터 입력받는 모든 값을 철저히 검증한다.
  • 입력값의 길이, 형식 등을 검사하고, 특수 문자를 필터링한다.

3. 최소 권한 부여:

  • 데이터베이스 사용자 계정에 최소한의 권한만 부여하여, 만약 공격자가 침입하더라도 피해를 최소화할 수 있다.

4. 웹 애플리케이션 방화벽(WAF):

  • WAF를 사용하여 SQL 인젝션 공격을 포함한 다양한 웹 공격을 탐지하고 차단할 수 있다.

 

데이터 베이스 백업

백업할 데이터베이스에서 우클릭

 

 

기존의 데이터를 유지한채 백업파일을 생성하려면 위와 같이 설정한다.

 

 

728x90
반응형

'개발자교육' 카테고리의 다른 글

24_07_19 오늘의 수업내용  (0) 2024.07.23
24_07_17 오늘의 수업내용  (0) 2024.07.22
24_07_18 오늘의 수업  (0) 2024.07.19
24_07_15 오늘의 수업내용  (0) 2024.07.16
24_07_12 오늘의 수업내용  (0) 2024.07.12