지난 시간에 DB를 구축하는 작업을 진행했다. 즉, Mysql을 이용해서 user table을 생성하고 User class를 자바 빈즈로 나타내보았다.
이제 JSP에서 실제로 회원 데이터 테이블에 접근이 가능하도록 DAO를 만들어주어야 한다. DAO는 Data Access Object (데이터 접근 객체)의 약자로 데이터베이스에서 회원 정보를 불러오거나 데이터베이스에 회원 정보를 넣고자 할 때 사용된다.
user package 하위에 userDAO
라는 클래스를 만들어준다. 이 클래스에 들어갈 내용은 다음과 같다.
userDAO
package user;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class UserDAO {
private Connection conn;
private PreparedStatement pstmt;
private ResultSet rs;
public UserDAO() {
try {
String dbURL = "jdbc:mysql://localhost:3306/BBS";
String dbID = "root";
String dbPassword = "kjh950330";
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(dbURL, dbID, dbPassword);
} catch (Exception e) {
e.printStackTrace();
}
}
public int login(String userID, String userPassword) {
String SQL = "SELECT userPassword FROM USER WHERE userID =?";
try {
pstmt = conn.prepareStatement(SQL);
pstmt.setString(1, userID);
rs = pstmt.executeQuery();
if (rs.next()) {
if(rs.getString(1).equals(userPassword)) {
return 1; // 로그인 성공
}
else
return 0; // 비밀번호 불일치
}
return -1; // 아이디가 없음
} catch (Exception e) {
e.printStackTrace();
}
return -2; // 데이터베이스 오류
}
}
userDAO 생성자
login(String userID, String userPassword) 생성자
그렇다면 마침내 로그인 기능을 완전히 구현한 것인가...?
Nope.
우리는 이제 로그인 기능을 수행하는 함수를 만들었을 뿐이다. 지금부터 이 함수를 실제로 사용해서 사용자에게 로그인 결과를 알려주는 페이지가 필요하다. 이것은 다음 포스팅에서 계속...
prepareStatement
사실 그냥 statement와 큰 차이점을 모르고 썼었는데, 이번 기회에 알게 되었다. preparedStatement는 sql문을 생성할 때 statement에서 변수 값을 넣었던 것과는 다르게 ? (물음표)를 사용한다.
preparedStatement(줄여서 pstmt) 는 여러가지 장점들이 있는데, 그 중 하나로 SQL injection 해킹 공격을 방어하는 수단으로도 쓰인다. 매개 변수로 넘어온 userID 같은 것을 물음표에 들어갈 수 있도록 해줘서 이 것에 들어가는 데이터는 문자열로 취급하기 때문에 SQL injection이 발생할 수 없게 만든다.
또한 현재 접속을 시도하고자 하는 사용자의 ID를 입력받고 실제로 ID가 존재하는지, 존재한다면 비밀번호가 무엇인지 DB에서 가져올 수 있도록 한다.
이에 대해 더 알고싶다면 yanghl98님의 velog 참조
https://velog.io/@yanghl98/Database-SQL-Injection
흔히 서버가 다운되거나 클라이언트의 요청을 제대로 처리하지 못하는 상황이 백 엔드의 주된 이슈라고 생각할 때가 많은데, 개인정보가 유출되는 해킹 또한 엄청난 규모의 피해로 이어지는 경우가 많다.
실제로도 국내 메이저 쇼핑몰, 은행, 정부기관 등의 사이트에서 해커들의 공격으로 인해 사용자들의 정보가 누수되는 일이 잦았다. 특히 SQL injection 같은 공격은 공격이 비교적 쉬운 편이고 공격에 성공할 경우 큰 피해를 입힐 수 있는 공격이라고 한다. 이를 보면서 백 엔드 개발자라면 정보 보안에 관해서도 깊게는 아니더라도 어느정도는 생각하고 있어야하고, 이를 고려해서 DB를 구축하는 것도 필요하다는 생각이 들었다.