로그인 폼: /login.do (GET)
로그인 처리: /login.do (POST)
로그아웃 처리: /logout.do
사용자 정보는 DB에서 조회 (예: USER_TBL)
CREATE TABLE USER_TBL (
USER_ID VARCHAR(50) PRIMARY KEY,
USER_NM VARCHAR(100),
PASSWORD VARCHAR(100)
);
샘플 사용자 추가:
INSERT INTO USER_TBL (USER_ID, USER_NM, PASSWORD)
VALUES ('testuser', '홍길동', 'test123');
@Controller
public class LoginController {
@Resource(name = "loginService")
private LoginService loginService;
@RequestMapping(value = "/login.do", method = RequestMethod.GET)
public String loginForm() {
return "login/login";
}
@RequestMapping(value = "/login.do", method = RequestMethod.POST)
public String login(
@RequestParam("userId") String userId,
@RequestParam("password") String password,
HttpSession session,
ModelMap model) {
LoginVO user = loginService.selectUser(userId, password);
if (user != null) {
session.setAttribute("loginVO", user);
return "redirect:/main.do";
} else {
model.addAttribute("message", "아이디 또는 비밀번호가 일치하지 않습니다.");
return "login/login";
}
}
@RequestMapping("/logout.do")
public String logout(HttpSession session) {
session.invalidate();
return "redirect:/login.do";
}
}
public interface LoginService {
LoginVO selectUser(String userId, String password) throws Exception;
}
@Service("loginService")
public class LoginServiceImpl implements LoginService {
@Resource(name = "loginMapper")
private LoginMapper loginMapper;
@Override
public LoginVO selectUser(String userId, String password) throws Exception {
return loginMapper.selectUser(userId, password);
}
}
public interface LoginMapper {
LoginVO selectUser(@Param("userId") String userId, @Param("password") String password);
}
<mapper namespace="loginMapper">
<select id="selectUser" parameterType="map" resultType="LoginVO">
SELECT USER_ID, USER_NM
FROM USER_TBL
WHERE USER_ID = #{userId}
AND PASSWORD = #{password}
</select>
</mapper>
public class LoginVO implements Serializable {
private String userId;
private String userNm;
// Getter/Setter 생략
}
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head><title>로그인</title></head>
<body>
<h2>로그인 페이지</h2>
<form action="<c:url value='/login.do'/>" method="post">
<label for="userId">아이디:</label>
<input type="text" name="userId" required /><br/>
<label for="password">비밀번호:</label>
<input type="password" name="password" required /><br/>
<button type="submit">로그인</button>
</form>
<c:if test="${not empty message}">
<p style="color:red">${message}</p>
</c:if>
</body>
</html>
<context:component-scan base-package="egovframework.example" />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
Tomcat 실행
http://localhost:8080/프로젝트명/login.do 접속
testuser / test123 로그인 → main.do 페이지로 리다이렉트
전자정부 프레임워크 기반 로그인 시스템은 보안 요구가 높은 공공 프로젝트에서 많이 사용되며, 위의 예시는 기본 형태이므로 향후에는 다음과 같은 기능도 고려해야 합니다:
비밀번호 암호화 (BCrypt 등)
로그인 시도 실패 횟수 제한
세션 타임아웃 설정
권한/역할 기반 접근제어