JSP - 로그인 기능 구현하기

jihan kong·2022년 2월 23일
0
post-thumbnail
post-custom-banner

지난 시간에 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; // 데이터베이스 오류
	}
}
  1. userDAO 생성자

    • try, catch문으로 예외처리
    • 예외 발생시 printStackTrace() 로 예외를 출력
    • Class.forName() 을 이용해서 드라이버 로드
      (드라이버 : mysql에 접속할 수 있도록 매개체 역할을 하는 하나의 라이브러리)
    • conn 객체를 사용하여 dbURL에 dbID, dbPassword를 통해 연결할 수 있게끔 해줌
      (연결이 되면 conn 객체안에 접속된 정보가 담기게 됨)
  2. login(String userID, String userPassword) 생성자

    • String SQL에 SELECT문으로 user table에서 해당 사용자의 패스워드를 가져올수 있게함
    • try, catch문으로 예외처리
    • 선언해둔 prepareStatement(pstmt)에 SQL문장을 DB에 삽입하는 형식으로 인스턴스를 가져옴
    • resultset(rs)에 pstmt를 실행한 결과를 넣어줌
    • 실행했을 때, ID가 아예 DB에 없는 경우 -1 리턴
    • SQL문장을 실행해서 나온 결과와 접속을 시도한 password 값이 일치한다면 1을 반환 (로그인 성공)
      그렇지 않다면 0을 반환 (ID는 일치하나, 비밀번호가 불일치)



그렇다면 마침내 로그인 기능을 완전히 구현한 것인가...?

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를 구축하는 것도 필요하다는 생각이 들었다.

profile
학습하며 도전하는 것을 즐기는 개발자
post-custom-banner

0개의 댓글