로그인한 회원의  안전한 정보변경을 위해 비밀번호를 재인증받아보자!! 

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

/**
* 암호화된 비밀번호 일치 여부
* 사용예) 
* 비번 : text123
* a: $qweqsd$awe.113212wqedasdqweqdqwdadwqwe ( DB에서 가져온 암호화된 비밀번호) 
* b: text123 
* @param a : DB에서 가져온 암호화된 비밀번호 
* @param b : 사용자가 입력한 비밀번호 (암호화 전) 
* @return 일치여부 
*/
public static boolean cryptMatch(String a, String b) {
	BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
	return encoder.matches(a, b);
}

 

BCryptPasswordEncoder 는 
BCrypt 라는 해시 함수를 사용한 구현체이다. 단순히 해시를 하는것 뿐만 아니라 Salt 를 넣는 작업까지 하므로, 입력값이 같음에도 불구하고 매번 다른 encoded된 값을 return 해주게 된다.

그러므로 문자열 비교에 사용되는 equals() 함수가아닌 matches 함수를 사용하는것이 적절하다. 

 

주의!! 

코드에 적힌바와 같이 파라메터 두개 모두 암호화된 상태가 아닌 "b" 는 사용자가 입력한 데이터 그대로 

입력해야한다.  

 

사전에 Spring Security 설정은 되어있어야 진행된다. 

SecurityContext sc = SecurityContextHolder.getContext();

//ID, PW, 권한을 설정합니다. PW는 null 이어도 상관없음
sc.setAuthentication(new UsernamePasswordAuthenticationToken(id, null, role)); // (id, pw, 권한)

//Spring security 세션에 등록
httpSession.setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, sc);

 

첫번째로 프론트와 컨트롤러에 Post로 설정되어있는지 확인해줘야한다.

Controller에 분명 method=RequestMethod.POST 라고 설정되어 있고 

@ResponseBody
@RequestMapping(value = "/reg", method = RequestMethod.POST)
	public Map<String, Object> test() {
		return null 
}

 

프론트단에서 보낼때도 분명 POST 방식으로 보냈는데 

$.post("/reg", $frm.serialize(), function(data, textStatus){
	if(textStatus =="success") { 
		$("#res").text(data.res); 		
	}
});

 

Request method 'POST' not supported 에러가 난다면 

SpringSecurity를 확인해봐야한다. .

csrf 설정이 되어있으면 요청할때 csrf 값을 보내줘야하는데 없어으면 위와같이 발생된 에러임.. 

config 파일에 아래처럼 disable 처리해준다. 

http.authorizeRequests().csrf().disable()

 

적용하고 다시 실행해보기! 

+ Recent posts