반응형
저번에 회원탈퇴 및 회원정보수정을 했는데요.
여기서 치명적인 단점이 있습니다.
바로 회원정보 수정화면으로 직접적으로 접속할 수 있기 때문에
개인정보 유출이 될 수 있습니다.
그래서 이러한 단점을 방지할 수 있는 Handler intercepor 대해서 알아보겠습니다.
본인 확인을 위한 응답하기
@GetMapping("/modify")
public String modify() {
// 회원 본인이 맞는지 패스워드 입력화면을 응답으로 주기
return "member/modifyPasswd";
}
회원정보 수정화면으로 다이렉트 접속방지를 위한
UUID를 통한 검증
@PostMapping("/modifyValid")
public ResponseEntity<String> modifyValid(String passwd, HttpSession session) {
MemberVO memberVO = (MemberVO) session.getAttribute("memberVO");
boolean isSamePasswd = BCrypt.checkpw(passwd, memberVO.getPasswd());
if (!isSamePasswd) {
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "text/html; charset=utf-8");
String str = Script.back("패스워드가 일치하지 않습니다.");
return new ResponseEntity<String>(str, headers, HttpStatus.OK);
}
// 비밀번호 일치할때
UUID uuid = UUID.randomUUID();
String strUuid = uuid.toString();
// 서버가 현재 비밀번호 일치하는 사용자임을 기억하기위해 uuid 문자열을 세션에 저장함
session.setAttribute("uuid", strUuid);
// 회원정보수정 폼 화면을 볼 수 있도록 해당 요청주소로 리다이렉트 시키기
HttpHeaders headers = new HttpHeaders();
headers.add("Location", "/member/modifyForm?uuid=" + strUuid); // redirect 경로 지정
// "/"로 리다이렉트
// 리다이렉트일 경우 HttpStatus.FOUND 지정해야 함
return new ResponseEntity<String>(headers, HttpStatus.FOUND);
} // modifyForm post
수정된 회원정보를 SQL문을 요청 후 화면으로 이동
@GetMapping("/modifyForm")
public String modifyForm(String uuid, HttpSession session) {
String sessUuid = (String) session.getAttribute("uuid");
if (uuid == null || !uuid.equals(sessUuid)) {
return "redirect:/member/modify";
}
session.removeAttribute("uuid");
return "member/modifyForm";
}
@PostMapping("/modifyProcess")
public String modifyProcess(MemberVO memberVO, HttpSession session) {
String hashPasswd = BCrypt.hashpw(memberVO.getPasswd(), BCrypt.gensalt());
memberVO.setPasswd(hashPasswd);
// 테이블에 회원정보 수정 처리
memberService.modifyMemberById(memberVO);
// 로그인 유지용 세션 정보 수정하기
MemberVO dbMemberVO = memberService.getMemberById(memberVO.getId());
session.setAttribute("memberVO", dbMemberVO);
return "redirect:/member/info";
} // modifyProcess post
유저 로그인 검증을 위해
Haddlerintercepor 사용방법
AuthLoginInterceptor.java
package com.example.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import com.example.domain.MemberVO;
public class AuthLoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 컨트롤러의 특정 메소드 호출시 그것보다 먼저 실행됨
HttpSession session = request.getSession();
MemberVO memberVO = (MemberVO) session.getAttribute("memberVO");
if (memberVO == null) { // 로그인 안했을때
response.sendRedirect("/member/login"); // 로그인 페이지로 리다이렉트 시키기
return false; // 호출하려던 컨트롤러 메소드는 호출 안함
}
return true; // 호출하려던 컨트롤러 메소드 호출 허락함
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// 컨트롤러의 특정 메소드 호출시 컨트롤러 메소드 호출완료 이후에 실행됨
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// 컨트롤러의 특정 메소드 호출시 컨트롤러 메소드 호출완료하고 리턴한 jsp뷰까지 실행완료후 실행됨
}
}
방금만든 클래스 빈으로 만들고 적용시키기
<beans:bean id="authLoginInterceptor" class="com.example.interceptor.AuthLoginInterceptor" />
<interceptors>
<interceptor>
<mapping path="/member/**"/>
<exclude-mapping path="/member/join"/>
<exclude-mapping path="/member/login"/>
<beans:ref bean="authLoginInterceptor"/>
</interceptor>
</interceptors>
</beans:beans>
반응형
'Back-End > Java' 카테고리의 다른 글
[Spring] Legacy Project 게시판 구현하기 (0) | 2021.06.10 |
---|---|
[Spring] Legacy Project 아이디 중복 확인하기 (0) | 2021.06.10 |
[Spring] Legacy Project 회원탈퇴 및 회원정보수정 구현하기 (0) | 2021.06.09 |
[Spring] Legacy Project DB연동 및 한글깨짐 해결 (0) | 2021.06.09 |
[Spring] Legacy Project Controller 설정 및 MVC 구조 (0) | 2021.06.09 |