팀프로젝트/SpringBoot

스프링 부트 팀플) 20240310_암호화/복호화 적용

일일일코_장민기 2024. 3. 10. 16:29
728x90
사람이 습관이라는게 참 무섭다.
항상 기록하면서 하지 않다 버릇하니까
싹 다 고치고 이제서야 포스팅 시작했다...

고친 곳은 크게 6군데
1. 로그인 시 비밀번호를 암호화해서 넘겨주기
2. 로그인 시 입력한 비밀번호를 암호화해서 DB의 비밀번호와 비교하는 Ajax 설정하기
3. 비밀번호 찾기에서 암호화된 비밀번호를 복호화해서 보여주기
4. 전체 비밀번호 찾기에서 복호화된 암호를 메일로 보내주기
5. 회원가입에서 입력한 암호를 암호화해서 저장하기
6. 디버그 모드에서 암호화된 유저 비밀번호를 복호화해서 확인할 수 있도록 만들기

 

 

우선
1. 로그인 시 비밀번호를 암호화해서 넘겨주기
//메인에서 로그인 여부 확인 에이젝스
	@RequestMapping(value = "AjaxCheckIrDPW", method = RequestMethod.POST)
	public String AjaxCheckIDPW(String userId, String userPw) throws NoSuchAlgorithmException, UnsupportedEncodingException, GeneralSecurityException {
		String realUserPw = sc.encrypt(userPw);
		System.out.println(" 로그인페이지: 디코딩된 비밀번호: " + realUserPw);
		
		boolean canLogin = lServ.loginPossible(userId, realUserPw);
		String mesg = "loginSuccess";
		if (!canLogin) {
			mesg = "loginFail";                
        }
		return mesg;
	}

 

로그인이 되면?
아무튼 로그인 후에 오는 메인 화면

 

잘 된다.

 

 

 


2. 로그인 시 입력한 비밀번호를 암호화해서 DB의 비밀번호와 비교하는 Ajax 설정하기
	//메인에서 로그인 여부 확인 에이젝스
	@RequestMapping(value = "AjaxCheckIDPW", method = RequestMethod.POST)
	public String AjaxCheckIDPW(String userId, String userPw) throws NoSuchAlgorithmException, UnsupportedEncodingException, GeneralSecurityException {
		String realUserPw = sc.encrypt(userPw);
		System.out.println(" 로그인페이지: 디코딩된 비밀번호: " + realUserPw);
		
		boolean canLogin = lServ.loginPossible(userId, realUserPw);
		String mesg = "loginSuccess";
		if (!canLogin) {
			mesg = "loginFail";                
        }
		return mesg;
	}

 

Ajax 출력 확인 완료

 

3. 비밀번호 찾기에서 암호화된 비밀번호를 복호화해서 보여주기
//비밀번호 찾기
	@RequestMapping(value = "/SearchPartPW", method = RequestMethod.POST)
	public String SearchPartPW(Model model, HttpServletResponse response, String userId, String userName, String ssn1, String ssn2) throws NoSuchAlgorithmException, UnsupportedEncodingException, GeneralSecurityException {
		MemberDTO dto = serv.findUserPW(userId, userName, ssn1, ssn2);
				
		if (dto != null) {
			String userPw = sc.decrypt(dto.getUserPw());
			dto.setUserPw(userPw);
			
			Cookie userIdCookie = new Cookie("findPW_userid",userId);
			userIdCookie.setMaxAge(30*60);
			response.addCookie(userIdCookie);
			
			model.addAttribute("dto", dto);
			return "member/Find_Info/viewPartPW";
		} else {
			return "member/Find_Info/cantFindUserdata";
		}
	}

 

 

 

이때 한 가지 이슈가 있었다.
원래는 

String userPw = sc.decrypt(dto.getUserPw());

dto.setUserPw(userPw);

이 코드가 

MemberDTO dto = serv.findUserPW(userId, userName, ssn1, ssn2);

이 코드 직후에 있었는데 

다음과 같은 에러가 발생했다.

 

특이하게 정보를 정확하게 입력하면 안 뜨고, 잘못 입력해서 유저확인불가 페이지로 가는 경우에 뜨는 오류였다.

 

생각해보면 디코딩 코드가 if절 밖에 있으면 null값을 디코딩하는 꼴이 된다.
스프링에서는 왜 잘 됐던 걸까?


아무튼 다음으
4. 전체 비밀번호 찾기에서 복호화된 암호를 메일로 보내주기
//전체 비밀번호 출력용
	@RequestMapping(value = "/SearchAllPW", method = RequestMethod.GET)
	public String SearchAllPW(Model model, String userId, HttpSession session) throws Exception {
		MemberDTO dto = serv.selectMemberData(userId);
		String userEmail = dto.getUserEmailId()+"@"+dto.getUserEmailDomain();
		String userPw = sc.decrypt(dto.getUserPw());
		dto.setUserPw(userPw);
		System.out.println(userPw);
		System.out.println(userEmail);
		System.out.println(dto);
		
		if (dto != null) {
			model.addAttribute("dto", dto);
			mc.sendEmail(userEmail, dto);
			return "member/Find_Info/viewAllPW";
		} else {
			return "member/Find_Info/cantFindUserdata";
		}

	}​

질문에 잘 응답하면?

 

잘 전송된다. 지금 생각해보니 저 이메일에 하이퍼링크를 박아서 누르면 갈 수 있게 하면 좋지 않을까?

 

 

잘 도착했다만...이메일 수정이 필요할 것 같다.

 

 

 

 

 

// 비밀번호 검증
		String userPw2 = dto.getUserPw();
		String userPw = sc.encrypt(userPw2);	
		String userPwConfirm = request.getParameter("userPwConfirm");

		if (!(userPw2.equals(userPwConfirm))) { // 비밀번호와 비밀번호 재확인 번호 일치 확인
			System.out.println("비밀번호 일치 오류 " + userPw2 + " " + userPwConfirm);
			System.out.println("회원 가입 실패");
			failMesg = false;
			request.setAttribute("mesg", "비밀번호가 일치하지 않습니다. 확인해주세요");
			return result;

		} else if (userPw2.length() < 6) { // 비밀번호 길이 규격확인
			System.out.println("비밀번호 길이 오류 " + userPw2 + " " + userPw.length());
			System.out.println("회원 가입 실패");
			request.setAttribute("mesg", "비밀번호 길이가 규정에 맞지 않습니다. 확인해주세요");
			return result;

		} else { // 비밀번호 규격 통과
			System.out.println("비밀번호 확인");
		}

 

잘 암호화돼서 저장되었다.




6. 디버그 모드에서 암호화된 유저 비밀번호를 복호화해서 확인할 수 있도록 만들기

여기도 이슈가 있었다.

 

 

 

원래는 비밀번호를 클릭하면 저렇게 복호화된 비밀번호가 보여야 하는데 에러가 나는 것이다.
놀라운 것은 이 jsp에서 쓰인 경로가 컨트롤러에서 안 보였다는 것;;
스프링 프로젝트에서 확인해보니 암호화/복호화 컨트롤러에 있었다.
암호화/복호화는 컨트롤러 자체를 바꿔버렸으니 안 나오는 게 당연하다...

 

 

@RestController, @GetMapping을 달아주었더니 잘 되었다.

 

 

포스팅하면서 생각난 2가지 작업까지 하고 주말 작업을 마치려고 한다.
1. 이메일 내용 수정
2. 전체 비밀번호 안내 화면의 하이퍼링크 달기

 

 

 

잘 된다.

 

 

 

다음 주중 학원 가서 프로젝트 시간 때는 4 가지 작업을 할 것 같다.
1. Redirect를 써서 새로고침 방지 작업
2. 코드 Warning 제거 + 게시판 작업
3. 로그인 jsp에 있는 쿠키를 컨트롤러로 옮겨서
로그인할 때 쓴 아이디/비밀번호가 쿠키에 저장되도록 하는 작업
4. 이메일 본문 디자인

그리고 그 부분이 끝나면 openAPI 외부 아이디 로그인/회원가입 작업을 할 것이다.
이런 부분들을 다하면 로그인/회원가입은 거의 완성이라고 할 수 있지 않을까?
다른 사람의 피드백을 받고 불편한 부분이 있으면 계속 수정만 하면 될 것 같다.