Spring 암호화 및 세션 삭제

최주영·2023년 7월 14일
0

spring

목록 보기
7/12

암호화

  • spring-security 모듈을 이용해서 암호화처리
  • 3가지 라이브러리 의존성 부여가 필요
    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:/";
	}
	
}
profile
우측 상단 햇님모양 클릭하셔서 무조건 야간모드로 봐주세요!!

0개의 댓글