본문 바로가기
CLASS/SERVLET

#9-2 / 보안2

by hingu 2024. 7. 5.

login (test) db 설계

create table login(
midx int(8) not null auto_increment,
mid varchar(30) not null,
mpass varchar(80) not null, //MD5 16진수로 받을거임
primary key(midx),
unique key(mid)
);

// test위해 data 미리 하나 만들어둠 (비번 1234)
insert into login values ('0','apink','81dc9bdb52d04dc2036dbd8313ed055');

 

🔽

 

spring 미리..

WEB-INF 폴더에 classes 폴더 생성 -> db.properties 파일 생성 

==> 이름 고정임 내맘대로 X !

        db.properties 에는 ;(세미콜론) X , 주석 작성시 #~

 

#properties 는 window에서 사용하는 환경설정에 .ini 파일과 동일한 형태의 파일

🔽 db.properties 파일 => db접속 정보 입력

driver = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://localhost:3306/cms
user = hana
password = hana1234
select_db = select * from login order by midx desc


//이거의 장점 : ddl 이 여기에 모임
//createStatement 사용 불가

 

dbcon.java -> class java파일

//database 연결 + properties 활용

public class dbcon {
	//classes에 있는 properties 파일을 사용하는 라이브러리
	Properties pp = new Properties();
	String resource = "db.properties"; //로드할 properties 파일명
	public Connection db() throws Exception{
		//classes 안에 있는 properties를 로드하여 모든 문자 내용을 저장시킴
		this.pp.load(this.getClass().getClassLoader().getResourceAsStream(resource));
		
		Class.forName(this.pp.getProperty("driver"));
		Connection con = DriverManager.getConnection(this.pp.getProperty("url"),this.pp.getProperty("user"),this.pp.getProperty("password"));
		
		return con;
	}
}

 

🔽

 

⚡ 암호화를 처리하여 로그인 하는 웹페이지

login.jsp
<body>
	<form id="frm" onsubmit="return logins()">
		아이디 : <input type="text" name="mid"><br>
		비밀번호 : <input type="text" name="mpass"><br>
		<button type="submit">로그인</button>
	</form>
</body>

<script>
	function logins(){
		frm.method="post";
		frm.action="./security2_login.do";
		return true;
	}
</script>


sercurity2_login.java (servlet 파일)

@WebServlet("/security2_login.do")
public class security2_login extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	//properties는 해당 로드값을 메모리에 저장시킨 후 프로세서가 종료되면 자동으로 소멸되로록 설정되어있음
	Properties pp = new Properties();
	String ddl = "db.properties";
	PreparedStatement ps = null;
	ResultSet rs = null;
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		dbcon dc = new dbcon();
		try {
			String mid = request.getParameter("mid");
			String mpass = request.getParameter("mpass");
			
			Connection con = dc.db();
			this.pp.load(this.getClass().getClassLoader().getResourceAsStream(ddl));
			this.ps = con.prepareStatement(this.pp.getProperty("select_db"));
			this.ps.setString(1, mid);
			this.rs = this.ps.executeQuery();

			this.rs.next();
			String db_mid = this.rs.getString("mid");
			String db_mpass = this.rs.getString("mpass");
			
			//사용자가 입력한 패스워드를 해당 메소드로 전송해 암호화 텍스트로 변경한 값이
			String userpw = new passwd_md5(mpass).md5_passwd();  
			
			if(userpw.equals(db_mpass)) { //db에 암호화되어 저장되있는 값과 같다면
				System.out.println("로그인 하셨습니다.");
			}else {
				System.out.println("올바른 패스워드가 아닙니다.");
			}
			
			this.rs.close();
			this.ps.close();
			con.close();
		}catch(Exception e) {
			System.out.println("db 연결 실패!");
		}
	}
}



- passwd_md5.java => 문자를 md5로 변환하는 class java파일

package shop;
import java.security.MessageDigest;

public class passwd_md5 {
	private StringBuilder repass = new StringBuilder();
	private String ori_pass = null;
	private MessageDigest md5 = null;
	
	public passwd_md5(String userpw) {
		this.ori_pass = userpw;
	}
	
	//사용자가 입력한 패스워드를 md5로 변환 후 return하는 메소드
	public String md5_pass() {
		try {
			this.md5 = MessageDigest.getInstance("md5");
			this.md5.update(this.ori_pass.getBytes());
			byte[] md = this.md5.digest();
			
			for(byte ck : md) {
				String m = String.format("%x", ck);
				this.repass.append(m);
			}
		}catch(Exception e) {
			System.out.println("암호화 변환 오류!");
		}		
		
		//return할 메소드 자료형이 String이므로 toString을 이용함
		return this.repass.toString();
	}
	
}

 

'CLASS > SERVLET' 카테고리의 다른 글

#9-1 / 보안  (1) 2024.07.05
web.xml 선언을 하지 않고 사용  (0) 2024.07.05
로그인 - 자동저장  (0) 2024.07.03
#8-2 / 게시판 insert 모듈화...  (0) 2024.06.21
#8-1 / 게시판  (0) 2024.06.21