Search
Duplicate

์ž๋™ ๋กœ๊ทธ์ธ

์ž๋™ ๋กœ๊ทธ์ธ

์ž๋™ ๋กœ๊ทธ์ธ ์ฒดํฌ ํ›„ ๋กœ๊ทธ์ธ ์‹œ, ์ธ์ฆ ํ† ํฐ์„ ์ฟ ํ‚ค๋กœ ๋ฐœ๊ธ‰ํ•˜๊ณ  ๋‹ค์Œ ์ ‘์† ์‹œ ๋กœ๊ทธ์ธ์ด ์ž๋™์œผ๋กœ ๋˜๋„๋ก ํ•˜๋Š” ๊ธฐ๋Šฅ

ํ™”๋ฉด

์ž‘์—… ์ˆœ์„œ

1.
persistence_logins.sql
2.
PersistenceLogins.java
3.
PersistenceLoginsDAO.java
4.
PersistenceLoginsService.java
5.
PersistenceLoginsServiceImpl.java
6.
UserServlet.java
7.
LoginFilter.java

์ฝ”๋“œ

persistence_logins.sql

DROP TABLE IF EXISTS `persistence_logins`; CREATE TABLE `persistence_logins` ( `no` INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '๋ฒˆํ˜ธ', `id` VARCHAR(255) NOT NULL COMMENT 'ID (UUID)', `username` VARCHAR(100) NOT NULL COMMENT 'ํšŒ์› ์•„์ด๋””', `token` VARCHAR(255) NOT NULL COMMENT '์ธ์ฆ ํ† ํฐ', `expiry_date` TIMESTAMP NOT NULL COMMENT '๋งŒ๋ฃŒ์‹œ๊ฐ„', `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '๋“ฑ๋ก์ผ์ž', `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '์ˆ˜์ •์ผ์ž' );
SQL
๋ณต์‚ฌ

PersistenceLogins.java

package board.DTO; import java.util.Date; import com.alohaclass.jdbc.annotation.*; import lombok.*; @Table("persistence_logins") @Data @NoArgsConstructor @AllArgsConstructor @Builder public class PersistenceLogins { @Pk private int no; private String id; private String username; private String token; private Date expiryDate; private Date createdAt; private Date updatedAt; }
Java
๋ณต์‚ฌ

PersistenceLoginsDAO.java

package board.DAO; import com.alohaclass.jdbc.dao.BaseDAOImpl; import board.DTO.PersistenceLogins; public class PersistenceLoginsDAO extends BaseDAOImpl<PersistenceLogins> { }
Java
๋ณต์‚ฌ

PersistenceLoginsService.java

package board.Service; import board.DTO.PersistenceLogins; public interface PersistenceLoginsService { // ํ† ํฐ ๋“ฑ๋ก public PersistenceLogins insert(String username); // ํ† ํฐ ์กฐํšŒ (์•„์ด๋””) public PersistenceLogins select(String username); // ํ† ํฐ ์กฐํšŒ (ํ† ํฐ) public PersistenceLogins selectByToken(String token); // ํ† ํฐ ์ˆ˜์ • public PersistenceLogins update(String username); // ํ† ํฐ ๊ฐฑ์‹  (์—†์œผ๋ฉด ๋“ฑ๋ก, ์žˆ์œผ๋ฉด ์ˆ˜์ •) public PersistenceLogins refresh(String username); // ํ† ํฐ ์œ ํšจ์„ฑ ์ฒดํฌ (๋งŒ๋ฃŒ์—ฌ๋ถ€ ํ™•์ธ) public boolean isValid(String token); // ํ† ํฐ ์‚ญ์ œ public boolean delete(String username); }
Java
๋ณต์‚ฌ

PersistenceLoginsServiceImpl.java

package board.Service; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.UUID; import board.DAO.PersistenceLoginsDAO; import board.DTO.PersistenceLogins; public class PersistenceLoginsServiceImpl implements PersistenceLoginsService { private PersistenceLoginsDAO persistenceLoginsDAO = new PersistenceLoginsDAO(); @Override public PersistenceLogins insert(String username) { // ํ˜„์žฌ ์‹œ๊ฐ + 7์ผ ํ›„ ๊ณ„์‚ฐ Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.DAY_OF_YEAR, 7); Date expiryDate = calendar.getTime(); // Builder๋ฅผ ์‚ฌ์šฉํ•œ ๊ฐ์ฒด ์ƒ์„ฑ PersistenceLogins login = PersistenceLogins.builder() .id(UUID.randomUUID().toString()) .username(username) .token(UUID.randomUUID().toString()) .expiryDate(expiryDate) .build(); try { login = persistenceLoginsDAO.insertKey(login); } catch (Exception e) { e.printStackTrace(); } return login; } @Override public PersistenceLogins select(String username) { PersistenceLogins login = null; Map<String, Object> map = new HashMap<>(); map.put("username", username); try { login = persistenceLoginsDAO.selectBy(map); } catch (Exception e) { e.printStackTrace(); } return login; } @Override public PersistenceLogins selectByToken(String token) { PersistenceLogins login = null; Map<String, Object> map = new HashMap<>(); map.put("token", token); try { login = persistenceLoginsDAO.selectBy(map); } catch (Exception e) { e.printStackTrace(); } return login; } @Override public PersistenceLogins update(String username) { // ํ˜„์žฌ ์‹œ๊ฐ + 7์ผ ํ›„ ๊ณ„์‚ฐ Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.DAY_OF_YEAR, 7); Date expiryDate = calendar.getTime(); PersistenceLogins login = PersistenceLogins.builder() .id(UUID.randomUUID().toString()) .username(username) .expiryDate(expiryDate) .updatedAt(new Date()) .build(); Map<String, Object> map = new HashMap<String, Object>(); map.put("username", username); PersistenceLogins origin = null; int result = 0; try { origin = persistenceLoginsDAO.selectBy(map); login.setNo(origin.getNo()); login.setToken(origin.getToken()); result = persistenceLoginsDAO.update(login); System.out.println("ํ† ํฐ ์ˆ˜์ • ์—ฌ๋ถ€ : " + result); } catch (Exception e) { e.printStackTrace(); } return login; } @Override public PersistenceLogins refresh(String username) { Map<String, Object> map = new HashMap<String, Object>(); map.put("username", username); PersistenceLogins origin = null; PersistenceLogins refresh = null; try { origin = persistenceLoginsDAO.selectBy(map); } catch (Exception e) { e.printStackTrace(); } // ํ† ํฐ์ด ์—†๋Š” ๊ฒฝ์šฐ, ์ƒ์„ฑ if( origin == null ) { refresh = insert(username); } // ํ† ํฐ์ด ์žˆ๋Š” ๊ฒฝ์šฐ, ๊ฐฑ์‹  else { refresh = update(username); } return refresh; } @Override public boolean isValid(String token) { PersistenceLogins login = selectByToken(token); if (login == null) return false; Date expiryDate = login.getExpiryDate(); Date now = new Date(); return expiryDate.after(now); // ํ˜„์žฌ ์‹œ๊ฐ„๋ณด๋‹ค ๋งŒ๋ฃŒ์ผ์ด ๋‚˜์ค‘์ด๋ฉด ์œ ํšจ } @Override public boolean delete(String username) { Map<String, Object> map = new HashMap<String, Object>(); map.put("username", username); int result = 0; try { result = persistenceLoginsDAO.deleteBy(map); } catch (Exception e) { e.printStackTrace(); } return result > 0; } }
Java
๋ณต์‚ฌ

LoginServlet.java

โ€ข
์ฃผ์š” ์ฝ”๋“œ
// ์ž๋™ ๋กœ๊ทธ์ธ --------------------------------------------------- String rememberMe = request.getParameter("rememberMe"); Cookie cookieRememberMe = new Cookie("rememberMe", ""); Cookie cookieToken = new Cookie("token", ""); // ์ฟ ํ‚ค ์„ค์ • cookieRememberMe.setPath("/"); cookieToken.setPath("/"); // ์ฟ ํ‚ค ๋งŒ๋ฃŒ์‹œ๊ฐ„ ์„ค์ • - 7์ผ (/์ดˆ) cookieRememberMe.setMaxAge(60*60*24*7); cookieToken.setMaxAge(60*60*24*7); // ์ž๋™ ๋กœ๊ทธ์ธ ์ฒดํฌ ์—ฌ๋ถ€ if( rememberMe != null && rememberMe.equals("on") ) { // ์ž๋™ ๋กœ๊ทธ์ธ ์ฒดํฌ ์‹œ // - ํ† ํฐ ๋ฐœํ–‰ PersistenceLoginsService persistenceLoginsService = new PersistenceLoginsServiceImpl(); PersistenceLogins persistenceLogins = persistenceLoginsService.refresh(username); String token = null; if( persistenceLogins != null ) { token = persistenceLogins.getToken(); } // - ์ฟ ํ‚ค ์ƒ์„ฑ cookieRememberMe.setValue( URLEncoder.encode(rememberMe, "UTF-8") ); cookieToken.setValue( URLEncoder.encode(token, "UTF-8") ); } else { // ์ž๋™ ๋กœ๊ทธ์ธ ๋ฏธ์ฒดํฌ ์‹œ // ์ฟ ํ‚ค ์‚ญ์ œ cookieRememberMe.setMaxAge(0); cookieToken.setMaxAge(0); } response.addCookie(cookieRememberMe); response.addCookie(cookieToken); // ์ž๋™ ๋กœ๊ทธ์ธ ๋ ---------------------------------------------------
Java
๋ณต์‚ฌ
โ€ข
์ „์ฒด ์ฝ”๋“œ
package board.servlet; import java.io.IOException; import java.net.URLDecoder; import java.net.URLEncoder; import board.DTO.PersistenceLogins; import board.DTO.Users; import board.Service.PersistenceLoginsService; import board.Service.PersistenceLoginsServiceImpl; import board.Service.UserService; import board.Service.UserServiceImpl; import jakarta.servlet.RequestDispatcher; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; @WebServlet({"/login", "/login.jsp"}) public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; private UserService userService = new UserServiceImpl(); protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String page = ""; // ์•„์ด๋”” ์ €์žฅ ์ฟ ํ‚ค ํ™•์ธ System.out.println("์•„์ด๋”” ์ €์žฅ ์ฟ ํ‚ค ํ™•์ธ ..."); String rememberId = ""; String username = ""; Cookie[] cookies = request.getCookies(); if( cookies != null ) { for( Cookie cookie : cookies ) { String cookieName = cookie.getName(); String cookieValue = URLDecoder.decode( cookie.getValue(), "UTF-8" ); switch(cookieName) { case "username" : username = cookieValue; break; case "rememberId" : rememberId = cookieValue; break; } } } request.setAttribute("username", username); request.setAttribute("rememberId", rememberId); page = "/page/login.jsp"; RequestDispatcher dispatcher = request.getRequestDispatcher(page); dispatcher.forward(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String root = request.getContextPath(); String path = request.getPathInfo(); // /login - ๋กœ๊ทธ์ธ String username = request.getParameter("username"); String password = request.getParameter("password"); // ์•„์ด๋”” ์ €์žฅ --------------------------------------------------- String rememberId = request.getParameter("rememberId"); Cookie cookieRememberId = new Cookie("rememberId", ""); Cookie cookieUsername = new Cookie("username", ""); cookieRememberId.setPath("/"); cookieUsername.setPath("/"); System.out.println("rememberId : " + rememberId); // ์•„์ด๋”” ์ €์žฅ ์ฒดํฌ ์‹œ - ๊ฐ’ : on if( rememberId != null && rememberId.equals("on") ) { // ์ฟ ํ‚ค ์ƒ์„ฑ cookieRememberId.setValue( URLEncoder.encode(rememberId, "UTF-8") ); cookieUsername.setValue( URLEncoder.encode(username, "UTF-8") ); // ์ฟ ํ‚ค ๋งŒ๋ฃŒ์‹œ๊ฐ„ ์„ค์ • - 7์ผ (/์ดˆ) cookieRememberId.setMaxAge(60*60*24*7); cookieUsername.setMaxAge(60*60*24*7); } // ์•„์ด๋”” ์ €์žฅ ์ฒดํฌ ํ•ด์ œ ์‹œ else { // ์ฟ ํ‚ค ์‚ญ์ œ - ์ฟ ํ‚ค ์œ ํšจ์‹œ๊ฐ„์„ 0์œผ๋กœ ํ•˜๊ณ  ์‘๋‹ต cookieRememberId.setMaxAge(0); cookieUsername.setMaxAge(0); } // ์‘๋‹ต์— ์ฟ ํ‚ค ๋“ฑ๋ก response.addCookie(cookieRememberId); response.addCookie(cookieUsername); // ์•„์ด๋”” ์ €์žฅ ๋ --------------------------------------------------- // ์ž๋™ ๋กœ๊ทธ์ธ --------------------------------------------------- String rememberMe = request.getParameter("rememberMe"); Cookie cookieRememberMe = new Cookie("rememberMe", ""); Cookie cookieToken = new Cookie("token", ""); // ์ฟ ํ‚ค ์„ค์ • cookieRememberMe.setPath("/"); cookieToken.setPath("/"); // ์ฟ ํ‚ค ๋งŒ๋ฃŒ์‹œ๊ฐ„ ์„ค์ • - 7์ผ (/์ดˆ) cookieRememberMe.setMaxAge(60*60*24*7); cookieToken.setMaxAge(60*60*24*7); // ์ž๋™ ๋กœ๊ทธ์ธ ์ฒดํฌ ์—ฌ๋ถ€ if( rememberMe != null && rememberMe.equals("on") ) { // ์ž๋™ ๋กœ๊ทธ์ธ ์ฒดํฌ ์‹œ // - ํ† ํฐ ๋ฐœํ–‰ PersistenceLoginsService persistenceLoginsService = new PersistenceLoginsServiceImpl(); PersistenceLogins persistenceLogins = persistenceLoginsService.refresh(username); String token = null; if( persistenceLogins != null ) { token = persistenceLogins.getToken(); } // - ์ฟ ํ‚ค ์ƒ์„ฑ cookieRememberMe.setValue( URLEncoder.encode(rememberMe, "UTF-8") ); cookieToken.setValue( URLEncoder.encode(token, "UTF-8") ); } else { // ์ž๋™ ๋กœ๊ทธ์ธ ๋ฏธ์ฒดํฌ ์‹œ // ์ฟ ํ‚ค ์‚ญ์ œ cookieRememberMe.setMaxAge(0); cookieToken.setMaxAge(0); } response.addCookie(cookieRememberMe); response.addCookie(cookieToken); // ์ž๋™ ๋กœ๊ทธ์ธ ๋ --------------------------------------------------- Users user = Users.builder() .username(username) .password(password) .build(); boolean result = userService.login(user); // ๋กœ๊ทธ์ธ ์„ฑ๊ณต if( result ) { // ํšŒ์› ์กฐํšŒ Users loginUser = userService.selectByUsername(username); loginUser.setPassword(null); // ์„ธ์…˜์— ์‚ฌ์šฉ์ž ์ •๋ณด ๋“ฑ๋ก HttpSession session = request.getSession(); session.setAttribute("loginId", user.getUsername()); session.setAttribute("loginUser", loginUser); response.sendRedirect(root + "/"); } // ๋กœ๊ทธ์ธ ์‹คํŒจ else { response.sendRedirect(root + "/login.jsp?error=true"); } // [๋กœ๊ทธ์ธ ๋] ############################################################## } }
Java
๋ณต์‚ฌ

LoginFilter.java

package board.filter; import java.io.IOException; import java.net.URLDecoder; import board.DTO.PersistenceLogins; import board.DTO.Users; import board.Service.PersistenceLoginsService; import board.Service.PersistenceLoginsServiceImpl; import board.Service.UserService; import board.Service.UserServiceImpl; import jakarta.servlet.Filter; import jakarta.servlet.FilterChain; import jakarta.servlet.FilterConfig; import jakarta.servlet.ServletException; import jakarta.servlet.ServletRequest; import jakarta.servlet.ServletResponse; import jakarta.servlet.annotation.WebFilter; import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpFilter; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpSession; @WebFilter(description = "์ž๋™ ๋กœ๊ทธ์ธ ๋“ฑ, ์ธ์ฆ ์ฒ˜๋ฆฌ ํ•„ํ„ฐ", urlPatterns = { "/*" }) public class LoginFilter extends HttpFilter implements Filter { private static final long serialVersionUID = 6470731114379833406L; PersistenceLoginsService persistenceLoginsService; UserService userService; public LoginFilter() { super(); } public void init(FilterConfig fConfig) throws ServletException { persistenceLoginsService = new PersistenceLoginsServiceImpl(); userService = new UserServiceImpl(); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // ์ฟ ํ‚ค ํ™•์ธ // 1. ์ž๋™ ๋กœ๊ทธ์ธ ์—ฌ๋ถ€ // 2. ์ธ์ฆ ํ† ํฐ HttpServletRequest httpRequest = (HttpServletRequest) request; Cookie[] cookies = httpRequest.getCookies(); String rememberMe = null; // ์ž๋™ ๋กœ๊ทธ์ด ์—ฌ๋ถ€ String token = null; // ์ธ์ฆ ํ† ํฐ if( cookies != null ) { for (Cookie cookie : cookies) { String cookieName = cookie.getName(); String cookieValue = URLDecoder.decode( cookie.getValue(), "UTF-8") ; switch (cookieName) { case "rememberMe" : rememberMe = cookieValue; break; case "token" : token = cookieValue; break; } } } System.out.println("LoginFilter..."); System.out.println("rememberMe : " + rememberMe); System.out.println("token : " + token); // ๋กœ๊ทธ์ธ ์—ฌ๋ถ€ ํ™•์ธ HttpSession session = httpRequest.getSession(); String loginId = (String) session.getAttribute("loginId"); Users loginUser = (Users) session.getAttribute("loginUser"); // ์ด๋ฏธ ๋กœ๊ทธ์ธ ๋จ if( loginId != null && loginUser != null ) { chain.doFilter(request, response); System.out.println("๋กœ๊ทธ์ธ๋œ ์‚ฌ์šฉ์ž : " + loginId); return; } // ์ž๋™ ๋กœ๊ทธ์ธ & ํ† ํฐ ok if( rememberMe != null && token != null ) { System.out.println("rememberMe : " + rememberMe); System.out.println("token : " + token); PersistenceLogins persistenceLogins = persistenceLoginsService.selectByToken(token); System.out.println("persistenceLogins : " + persistenceLogins); boolean isValid = persistenceLoginsService.isValid(token); // ํ† ํฐ์ด ์กด์žฌ, ์œ ํšจ if( persistenceLogins != null && isValid ) { loginId = persistenceLogins.getUsername(); loginUser = userService.selectByUsername(loginId); System.out.println("loginId : " + loginId); System.out.println("loginUser : " + loginUser); // ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ session.setAttribute("loginId", loginId); session.setAttribute("loginUser", loginUser); System.out.println("์ž๋™ ๋กœ๊ทธ์ธ ์„ฑ๊ณต : " + loginUser); } } chain.doFilter(request, response); } public void destroy() { } }
Java
๋ณต์‚ฌ