암호화
spring-security
모듈을 이용해서 암호화처리security-core
security-web
security-config
(1) : pom.xml에 라이브러리 추가
<!-- pom.xml -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>${org.springsecurity-version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${org.springsecurity-version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>${org.springsecurity-version}</version>
</dependency>
(2) : appServlet 밑에 새로운 xml파일을 만들어서 암호화처리 클래스를 빈으로 등록
다음과 같이 xml 파일을 추가했으므로
web.xml
에서 밑에와 같이 추가해준다<!-- web.xml --> <context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/spring/root-context.xml /WEB-INF/spring/security-context.xml <!-- 이와 같이 추가 --> </param-value> </context-param>
<!-- security-context.xml --> <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:security="http://www.springframework.org/schema/security" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-5.2.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> <!-- 암호화처리 클래스를 빈으로 등록하기 --> <bean id="bcryptPassword" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/> </beans>
위와 같이 초기 xml파일 설정을 다 해준다
(3) 컨트롤러에서 암호화
및 세션 생성
, 세션 삭제
적용해보기
@Controller
@SessionAttributes({"loginMember"}) // 현재세션 갖고오기
public class MemberController {
@Autowired
private MemberService service;
@Autowired
private BCryptPasswordEncoder passwordEncoder; // 암호화클래스 해당하는 빈을 찾아서 주입
@RequestMapping(value="/insertMember.do", method=RequestMethod.POST) // 회원가입 컨트롤
public String insertMember(Member m, Model model) {
// 패스워드를 암호화해서 처리하자
String oriPassword=m.getPassword(); // oriPassword = 원본 비밀번호
String encodePassword = passwordEncoder.encode(oriPassword); // 암호화한 비밀번호
m.setPassword(encodePassword); // setter함수 이용해서 비밀번호 필드에 암호화된 비밀번호 적용
int result = service.insertMember(m);
model.addAttribute("msg",result>0?"회원가입성공":"회원가입실패");
model.addAttribute("loc",result>0?"/":"/member/enrollMember.do");
return "common/msg";
}
@RequestMapping(value="/login.do", method=RequestMethod.POST) // 로그인 컨트롤
// 인수로, Member m 도 가능 (알아서 일치하는 값들만 세터로 넣어줌)
public String loginMember(@RequestParam Map param, Model model) // HttpSession session
{
Member m = service.selectMemberById(param);
// 암호화된값을 비교하기 위해서는 BCrptPasswordEncoder 가 제공하는 메소드를 이용해야한다.
/* passwordEncoder.matches(원본비밀번호, 암호화된비밀번호 ) */
if(m!=null && passwordEncoder.matches((String)param.get("password"), m.getPassword())) { // 암호화때문에 두번째 조건이존재
// session.setAttribute("loginMember", m); // 세션에다 로그인한 member 객체 저장
// model 의 생명주기는 request와 같음
model.addAttribute("loginMember", m);
}else {
model.addAttribute("msg", "로그인 실패");
model.addAttribute("loc","/");
return "common/msg";
}
return "redirect:/";
}
//@RequestMapping("/logout.do") // 로그아웃 컨트롤 (세션을 이용해서 로그아웃)
// public String logout(HttpSession session){
//if(session!=null) {
// session.invalidate();
//}
// return "redirect:/";
// }
// SessionStatus 객체를 이용해서 로그아웃(세션 삭제)
@RequestMapping("/logout.do")
public String logout(SessionStatus status) {
if(!status.isComplete())status.setComplete(); // 세션을 만료시킴
return "redirect:/";
}
}