본문 바로가기
JSP 웹 프로젝트

JSP 웹 프로젝트 (2) 회원가입

by s_hoonee 2023. 1. 3.
반응형

대학생을 위한 웹 페이지 제작

사용 언어 : java (jdk 12.0.2), JavaScript, css, html
사용 툴 : Eclipse
데이터베이스 : Mysql
서버 : Tomcat
테스트 브라우저 : Chrome, Edge
파일 : jsp

시스템 구성도


회원가입 UI

회원가입

 

 

java 파일

public class User {
	private String userID;
	private String userPassword;
	private String userName;
	private String userGender;
	private String userEmail;
	private String userSalt;
	
	public String getUserSalt() {
		return userSalt;
	}
	public void setUserSalt(String userSalt) {
		this.userSalt = userSalt;
	}
	public String getUserID() {
		return userID;
	}
	public void setUserID(String userID) {
		this.userID = userID;
	}
	public String getUserPassword()  {

	    return  userPassword;
	}
	public void setUserPassword(String userPassword) {
		this.userPassword = userPassword;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getUserGender() {
		return userGender;
	}
	public void setUserGender(String userGender) {
		this.userGender = userGender;
	}
	public String getUserEmail() {
		return userEmail;
	}
	public void setUserEmail(String userEmail) {
		this.userEmail = userEmail;
	}
}

연동된 DB에 해당 컬럼들을 넣어주고 변수 선언, Getter, Setter 세팅 해줍니다.

단축키  Alt + Shift + S -> Generate Getter and Setter -> 필드 선택(select all) -> enter

 

 

 

회원가입 데이터 DB에 넣기

비밀번호 생성시  salt 값과 해쉬값을 결합하는데 아래 암호화 글에서 설명

2023.01.03 - [암호화] - SALT 이용 암호화 (SHA - 512)

해쉬함수로 암호화를 원치 않는 경우  join메소드에서

[ SHA512(user.getUserPassword(), salt )] -> [ user.getUserPassword ] 로 변경

 

 

ID 중복방지  (개체 무결성)

※ 기본키인 UserID가 중복으로 들어온다면 return 값에 -1을 주어 회원가입 실패 유도,  id 중복방지 

public int join(User user) {
		String SQL = "insert into user values (?,?,?,?,?,?)";
		try {
			pstmt = conn.prepareStatement(SQL); // DB에 sql문 삽입
			pstmt.setString(1, user.getUserID()); // 받아온 userID를 ?에 할당하기
		String salt = Salt(); // 임의의 salt 값 생성
			pstmt.setString(2, SHA512(user.getUserPassword(), salt)); //해당 패스워드와 짝 지어진 salt 값
			pstmt.setString(3, user.getUserName());
			pstmt.setString(4, user.getUserGender());
			pstmt.setString(5, user.getUserEmail());
			pstmt.setString(6, salt);
			return pstmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return -1; // 데이터베이스 오류
	}
	public String getName(String userID) {
		String SQL = "select userName from user where userID = ?";
		String id = "";
		try {
			pstmt = conn.prepareStatement(SQL); // DB에 sql문 삽입
			pstmt.setString(1, userID); // 받아온 userID를 ?에 할당하기
			rs = pstmt.executeQuery();
			if (rs.next()) {
				id = rs.getString("userName");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return id;
	}

	public String getEmail(String userID) {
		String SQL = "select userEmail from user where userID = ?";
		String id = "";
		try {
			pstmt = conn.prepareStatement(SQL); // DB에 sql문 삽입
			pstmt.setString(1, userID); // 받아온 userID를 ?에 할당하기
			rs = pstmt.executeQuery();
			if (rs.next()) {
				id = rs.getString("userEmail");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return id;
	}

	//-------암호화
		// Salt 생성
		public String Salt() {
			String salt = ""; // 난수 값
			try {
				// 솔트를 사용하기 위해 SecureRandom 클래스를 사용 -> SecureRandom은 OS에서 임의 데이터를 가져옴
				// 시스템 시간을 통해 시드가 정해지고 의사 난수를 통해 만들어지는 Random 클래스는 적합하지 않음 -> seed값 무작위 생성 시 같은 값이 반복될 확룔이 높음 -> 시드 생성 시간을 알면 공격자에게 취약함
				SecureRandom random = SecureRandom.getInstance("SHA1PRNG"); // SHA1PRNG 의사 난수 생성기
				byte[] bytes = new byte[16]; // 생성 하여 받음
				random.nextBytes(bytes); // 생성한 배열에 받아주기
				salt = new String(Base64.getEncoder().encode(bytes)); // 생성된 salt -> Base64 클래스로 인코딩해주기
			} catch (NoSuchAlgorithmException e) {
				System.out.println("난수 생성 오류");
				e.printStackTrace();
			}
			return salt;
		}

	// SHA512 암호화
	public static String SHA512(String password, String hash) {

		String salt = hash + password; // 암호화를 위한 준비 -> 해싱에 사용할 값
		String hex = null;

		try {
			MessageDigest msg = MessageDigest.getInstance("SHA-512"); // SHA-512 해시함수를 사용하여 인스턴스 타입 생성 -> 해싱을 하기 위해서는 MessageDigest 클래스를 사용
			// -> SHA-512 알고리즘 사용
			msg.update(salt.getBytes()); // 해싱에 사용할 값을 바이트 코드로 변환하여 해싱 인스턴스에 업데이트			
			// 셋팅된 값을 최종적으로 digest() 함수를 통해서 해싱값을 생성
			// 최종적으로 SHA-512 해싱된 값이 16진수로 128바이트로 나오게 됨
			hex = String.format("%128x", new BigInteger(1, msg.digest())); // hex가 최종적으로 나온 해싱 결과값 
			// -> 범위가 큰 연산을 진행할 떄 스택 오버플로우 방지를 위해 BigInteger 클래스 사용
		} catch (Exception e) {
			System.out.println("암호화 오류");
			e.printStackTrace();
		}

		return hex;
	}
}

 


 

jsp 파일

  • 입력 안된 사항 체크
  • 아이디 중복 체크
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ page import = "user.UserDAO" %>
<%@ page import = "java.io.PrintWriter" %>
<% request.setCharacterEncoding("UTF-8"); %>
    <jsp:useBean id="user" class= "user.User" scope="page" />
    <jsp:setProperty name ="user" property="userID"/>
    <jsp:setProperty name ="user" property="userPassword"/>
    <jsp:setProperty name ="user" property="userName"/>
    <jsp:setProperty name ="user" property="userGender"/>
    <jsp:setProperty name ="user" property="userEmail"/>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원가입 시도</title>
</head>
<body>
      
	<% 
	String userID = null;
	if(session.getAttribute("userID")!= null){
		userID = (String) session.getAttribute("userID");
		System.out.println("세션이 있음 : "+ userID);
	}
	
	if(userID != null){  // session 을 받아서 로그인이 되어 있는 경우
		PrintWriter script = response.getWriter();
		script.println("<script>");
		script.println("alert('이미 로그인이 되어 있습니다.')");
		script.println("location.href = 'main.jsp' ");
		script.println("</script>");
	}
		if(user.getUserID() == null || user.getUserPassword() == null || user.getUserName() == null ||
				user.getUserGender() == null || user.getUserEmail() == null ){
			PrintWriter script = response.getWriter();
			script.println("<script>");
			script.println("alert('입력 안된 사항이 있습니다.')");
			script.println("history.back()");
			script.println("</script>");
		}else {
			UserDAO userDAO = new UserDAO();
			int result = userDAO.join(user);
			if(result == -1){
				PrintWriter script = response.getWriter();
				script.println("<script>");
				script.println("alert('이미 존재하는 아이디입니다.')");
				script.println("history.back()");
				script.println("</script>");
			}else {
				session.setAttribute("userID", user.getUserID());  //??
				PrintWriter script = response.getWriter();
				script.println("<script>");
				script.println("alert('회원가입이 완료 되었습니다..')");
				script.println("location.href = 'login.jsp' ");
				script.println("</script>");
			}
			
		}
	
	
	%>

</body>
</html>