티스토리 뷰
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 데이터베이스와 통신할 수 있게 한다.
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 인젝션 공격의 위험성
- 데이터 유출: 공격자는 민감한 정보를 탈취할 수 있다.
- 데이터 변경 및 삭제: 공격자는 데이터를 변경하거나 삭제할 수 있다.
- 인증 우회: 공격자는 인증 절차를 우회하여 시스템에 접근할 수 있다.
- 명령어 실행: 심각한 경우, 공격자는 데이터베이스 서버에서 시스템 명령어를 실행할 수 있다.
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 |
반응형
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 객체 지향 프로그래맹의 특징(캡슐화|상속|다형성)
- resultsetimpl
- JavaScript
- stored program
- 반복문
- 호이스팅(hoisting)
- 오버로딩vs오버라이딩
- 변수표기법
- 가변 길이 매개변수와 리턴
- 함수범위vs블록범위
- cte ( common table expression )
- jdbc
- 뷰(view)
- javascript자료형
- let-const-var
- 문자열비교메서드
- 데이터변환함수
- 조건문
- 클래스의 구성 멤버
- http 프로토콜:get vs post
- 참조타입vs기본타입
- ㅎgroupbyvs윈도우함수
- Java
- 데이터베이스(mysql)
- 배열(Array)
- 필드 초기화와 사용
- 테이터베이스 설계
- jsp의 주요 태그
- get한글인코딩
- 제어흐름함수
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
글 보관함