1. 로그인
1) 비밀번호 암호화(BCryptPasswordEncoder)
BCrypt 암호화 (Spring Security 제공)
* - 입력된 문자열(비밀번호)에 salt를 추가한 후 암호화
*
* ex) A 회원 : 1234 -> $12!asdfg
* ex) B 회원 : 1234 -> $12!qwert
*
* - 비밀번호 확인 방법
* -> BCryptePasswordEncoder.matches(평문 비밀번호, 암호화된 비밀번호)
* --> 평문 비밀번호와 암호화된 비밀번호가 같은 경우 true 아니면 false 반환
*
*
* * 로그인 / 비밀번호 변경 / 탈퇴 등 비밀번호가 입력되는 경우
* - DB에 저장된 암호화된 비밀번호를 조회해서
* matches() 메서드로 비교해야 한다!
sha 방식 암호화
* ex) A 회원 : 1234 -> 암호화 : abcd
* ex) B 회원 : 1234 -> 암호화 : abcd(암호화 시 변경된 내용이 같음)
SecurityConfig
@Configuration
public class SecurityConfig {
@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder() {
return new BCryptPasswordEncoder();
}
}
MemberserviceImpl
@Autowired
private BCryptPasswordEncoder bcrypt;
@Override
public Member login(Member inputMember) {
String bcryptPassword = bcrypt.encode(inputMember.getMemberPw());
log.debug("bcryptPassword : " + bcryptPassword);
return null;
}

2) 암호화된 비밀번호로 샘플 데이터 변경

boolean result = bcrypt.matches(inputMember.getMemberPw(), bcryptPassword);
log.debug("result : " + result);

3) 로그인 결과
Controller
@SessionAttributes({"loginMember"})
@Controller
@Slf4j
@RequestMapping("member")
public class MemberController {
@Autowired
private MemberService service;
@PostMapping("login")
public String login(Member inputMember,
RedirectAttributes ra,
Model model) {
Member loginMember = service.login(inputMember);
if(loginMember == null) {
ra.addFlashAttribute("message", "아이디 또는 비밀번호가 일치하지 않습니다.");
}
if(loginMember != null) {
model.addAttribute("loginMember", loginMember);
}
return "redirect:/";
}
}
Service
@Transactional(rollbackFor = Exception.class)
@Service
@Slf4j
public class MemberServiceImpl implements MemberService {
@Autowired
private MemberMapper mapper;
@Autowired
private BCryptPasswordEncoder bcrypt;
@Override
public Member login(Member inputMember) {
Member loginMember = mapper.login(inputMember.getMemberEmail());
if(loginMember == null) return null;
if(!bcrypt.matches(inputMember.getMemberPw(), loginMember.getMemberPw())) {
return null;
}
loginMember.setMemberPw(null);
return loginMember;
}
}
mapper
<select id="login" resultType="Member">
SELECT MEMBER_NO, MEMBER_EMAIL, MEMBER_NICKNAME, MEMBER_PW,
MEMBER_TEL, MEMBER_ADDRESS, PROFILE_IMG, AUTHORITY,
TO_CHAR(ENROLL_DATE, 'YYYY"년" MM"월" DD"일" HH24"시" MI"분" SS"초"') ENROLL_DATE
FROM "MEMBER"
WHERE MEMBER_EMAIL = #{memberEmail}
AND MEMBER_DEL_FL = 'N'
</select>

<script th:inline="javascript">
const message = "전달 받은 message";
if(message != null) alert(message);
</script>