Developer Note/국비과정 수업내용 정리&저장

24년 10월 25일

DH_PARK 2024. 10. 25. 01:18

오전

어제 한 문제 풀이

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>로그인</h1>
	<form action="${pageContext.request.contextPath}/C06/03/proc/loginProc.jsp" method="post">	
		<div>
			<label>${msg_userid}</label><br>
			<input type="text" name="userid" />
		</div>	
		<div>
			<label>${msg_password}</label><br>
			<input type="text" name="password" />
		</div>	
		<div>
			<input type="submit" value="로그인" />
		</div>	
	</form>
	<div>
		${msg_db}
	</div>
	
</body>
</html>

 

 

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

   <%
   String userid = request.getParameter("userid");
   String password= request.getParameter("password");
   
   if(isValid(userid,password,request)){
	   //유효성 체크 오류 발생한 경우
	   //값이 없을 경우 , 다시 로그인을 하기위해 login 으로 forward 처리
	   request.getRequestDispatcher("../login.jsp").forward(request,response);
	   return ;
   }
   
   UserDto dbUser = select(userid);
   if(dbUser==null){
	   //회원정보 x -> 회원가입페이지로 이동
	   request.setAttribute("db_msg", "이미 존재하는 회원");
	   request.getRequestDispatcher("../join.jsp").forward(request, response);
   }else{
	   //회원정보 o , 비밀번호 확인
	   if(!password.equals(dbUser.getPassword())){
		   request.setAttribute("db_pw", "패스워드 불일치");
		   request.getRequestDispatcher("../login.jsp").forward(request,response);
		   return ;
		   
	   }
   }
	
   //인증 이후 처리
   session.setAttribute("id", dbUser.getUserid());
   session.setAttribute("Role", dbUser.getRole());
   session.setMaxInactiveInterval(30);
   out.print("<script>alert('로그인 성공\n메인페이지로 이동하겠다');location.href='01_JSP/C06/03/main.jsp'	</script>");
   
   %>
   
   <%@ page import ="java.sql.*" %>
   <%@ page import ="C06.*" %>
   <%!
   HttpServletRequest request;
   
   private String url = "jdbc:mysql://localhost/bookdb?serverTimezone=UTC";
   private String id = "root";
   private String pw = "1234";
   
   private Connection conn;
   private PreparedStatement pstmt;
   private ResultSet rs;
   
   		private boolean isValid(String id,String pw,  HttpServletRequest request){
	   if(id.trim().isEmpty()){  //유효성 검사 함수
		   request.setAttribute("msg_userid","id입력하셈");
		  return false;
	   }
	   if(pw.trim().isEmpty()){
		   request.setAttribute("msg_password","비번을 입력하셈");
		  return false;
	   }
	   return true;
   }  //값이 하나라도 비어있다면 false 반환 , 아니면 true 반환
   		
   	private UserDto select(String userid) throws SQLException{
  		UserDto dto = null;
   		try{
   		Class.forName("com.mysql.cj.jdbc.Driver");
		conn=DriverManager.getConnection(url,id,pw);
   		pstmt = conn.prepareStatement("select * from tbl_user where username=?");
   		pstmt.setString(1, userid);
   		
   		rs = pstmt.executeQuery();

   		if(rs!=null && rs.next()) {
   			String username = rs.getString("username");
   			String password = rs.getString("password");
   			String role = rs.getString("role");
   			
   			UserDto userdto = new UserDto(username,password,role);

   		}
   		}catch(Exception e){
   			e.printStackTrace();
   		}
   		
   		conn.close();
   		rs.close();
   		pstmt.close();
   		return dto;
   	
   	
   	}
   	

   %>
   <%
   
   %>

 



그리고 try 문에서 connection 을 얻어서 jdbc 로 DB 와 연결할 때 웬만하면 finally 로 객체들을 닫아주는것이 좋다. throws 보다는 finally 로 하는게 안전한 방법.

객체를 닫아주지 않으거나 try 안에서 실행하게 된다면 안되는 이유가, try 문에서 코드가 실행이 되다가 예외가 발생하면 그 즉시 catch 로 넘어가기 때문에 반드시 실행이 되는 finally 로 객체를 닫아주는 코드를 작성해야 안전하게 객체를 닫을 수 있게 된다.

그리고 객체를 닫아주어야 하는 이유는 메모리를 계속 사용중이게 되어 메모리 누수가 발생할 수 있고 DB 의 연결 수에는 한계가 있기 때문에 connection 객체를 닫아주어야 다른 요청에서 새롭게 커넥션을 받아서 사용할 수가 있게 된다.

 


쿠키 :

문자열 데이터만 저장가능

4Kbyte 이하의 공간을 차지

여러개의 쿠키 설정가능(최대 300개)

도메인당 20개까지 저장가능

저장한도를 초과하면 최근에 사용되지 않는 쿠키부터 자동삭제

서버에서 클라이언트한테 줌 = response 방식

// 쿠키 생성
Cookie cookie = new Cookie("cookieName", "value1");

// 쿠키 값 재설정
cookie.setValue("value2");

// 쿠키 유지 시간 설정(초단위)
cookie.setMaxAge(60*2); 

// 쿠키를 클라이언트로 전송
response.addCookie(cookie);

쿠키는 여러개를 저장할 수 있기 때문에 배열로 만들어 반복문으로 값을 읽어오도록 할 수 있다.

Cookie[] cookies = request.getCookies(); //client에서 쿠키를 받아옴

String cookieName = "";
String cookieValue = "";

if(cookies!=null){
    for(int i=0;i<cookies.length;i++){
        if(cookies[i].getName().equals("cookieName")){
            cookieName = cookies[i].getName();
            cookieValue = cookies[i].getValue();
        }
    }
} //쿠키 배열 길이만큼 반복,  cookie name 과 비교해 쿠키가 존재한다면
	getname() , getValue() 메서드로 값을 읽어온다

쿠키를 삭제할 수도 있다.

if(cookies != null){
    for(int i=0; i < cookies.length; i++){
    	// 쿠키 유지시간은 0으로 설정
        cookies[i].setMaxAge(0);
        
        // 변경된 쿠기 정보를 다시 클라이언트에 전달
        response.addCookie(cookies[i]);
    }
}

 

JSP 내장객체들 종류

  • pageContext : 다른 내장 객체를 생성하는 역할
    • 다른 객체들의 상위객체는 아니지만 비슷한 역할을 한다.
    • jsp 페이지에서 사용하는 여러 스코프 객체에 접근할 수 있다. getRequest , getSession() 과 같이 다른 객체들을 가져올 수 있다.
  • pageScope : jsp가 서블릿으로 변환되었을 때 , Servlet 객체 자신을 의미한다.
  • requestscope : request에 접근하는 역할
  • responseScope : response 에 접근
  • applicationScope : appli 객체 , servletContext 객체에 접근하기 위한 역할

오늘 수업을 하다가 비밀번호를 암호화하는 방법에 대해 배웠는데, BCryptPasswordEncoder 라는 객체를 사용해서 단방향 암호화를 하는 법을 배웠다.

		BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
		System.out.println(passwordEncoder);
		passwordEncoder.encode(username);

encode() 메서드는 비밀번호를 암호화해준다.

matches() 메서드는 입력한 비밀번호와 저장된 암호화된 비밀번호가 일치하는지 검증해주는 기능이다.

두 값을 비교해서 일치하면 true , 아니면 false 를 반환한다. (equals랑 비슷한것 같다)

passwordEncoder.encode(username); //이런식으로 username 을 암호화한다면

$2a$10$EIX/xU0D1Eu76.GZ0sOiOe/QMB6V6KdZBcHg3XfR7Vp7d4N2j9WbC
이런식의 값으로 저장된다.
여기서도 약간의 구분을 하는 방법이 있는데,
$ 를 기준으로 구분을 하게 된다.
$2a : 사용된 해시 알고리즘 버전
$10$ : 해시 비용. 해시를 생성할 때 소요되는 반복 횟수를 나타낸다
	값이 클수록 더 많은 자원을 사용하지만 안정성이 높아진다
	

'Developer Note > 국비과정 수업내용 정리&저장' 카테고리의 다른 글

24년 10월 30일  (1) 2024.11.04
24년 10월 29일  (0) 2024.11.03
24년 10월 22일  (0) 2024.10.23
24년 10월 18일  (1) 2024.10.21
24년 10월 17일  (1) 2024.10.21