Back-End/Java

[Spring] Legacy Project Handler intercepor 사용법

CJun 2021. 6. 10. 07:11
반응형
 

[Spring] Legacy Project 회원탈퇴 및 회원정보수정 구현하기

MemberController.java package com.example.controller; import java.util.Date; import java.util.UUID; import javax.servlet.http.HttpSession; import org.mindrot.jbcrypt.BCrypt; import org.springframewo..

soulno.tistory.com

저번에 회원탈퇴 및 회원정보수정을 했는데요.

여기서 치명적인 단점이 있습니다.

바로 회원정보 수정화면으로 직접적으로 접속할 수 있기 때문에

개인정보 유출이 될 수 있습니다.

 

그래서 이러한 단점을 방지할 수 있는  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>
반응형