오전
어제 한 문제 풀이
<%@ 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 |