spring security crypto 이용- 암호화된 로그인

brave_chicken·2024년 6월 20일

잇(IT)생 챌린지

목록 보기
75/90

build.gradle에 아래코드 추가 & 리빌드

implementation 'org.springframework.security:spring-security-crypto:5.7.1'

PasswordConfig 생성

@Configuration
public class PasswordConfig {
    //PasswordEncoder : 패스워드 암호화를 위해 제공되는 상위클래스
    //PasswordEncoder객체를 만들어서 제공
    @Bean
    public PasswordEncoder passwordEncoder(){
        return PasswordEncoderFactories.createDelegatingPasswordEncoder();
    }
}

register 변경 - 인원등록부분

MemberController

편의상 변경된 사항만 기입

@Controller
@RequestMapping("/member")
@SessionAttributes("user")
@RequiredArgsConstructor
public class MemberController {
	private final MemberService service;
	private final DeptService deptservice;
	private final FileUploadService fileuploadService;
	private final PasswordEncoder passwordEncoder;


//	스프링에서 제공되는 기능을 이용해서 로그인 처리하기
	@PostMapping("/spring/login")
	public String springlogin(MemberDTO loginUserInfo, Model model) {
		System.out.println("스프링이 제공하는 @SessionAttributes를 이용해서 로그인");
		MemberDTO user = service.login(loginUserInfo);
		System.out.println("------------로그인한 사용자정보:"+user);
		String view = "";

		/*
		passwordEncoder.matches(loginUserInfo.getPass(), user.getPass())
								----------------------	---------------
								로그인하며 사용자가 입력한 값 	디비에서 조회한 사용자의 패스워드값
		=> 로그인하며 사용자가 입력한 값을 암호화하고 디비에 저장된 값을 비교해서 일치하면 true 아니면 false
		*/
		if(user!=null & passwordEncoder.matches(loginUserInfo.getPass(), user.getPass())) {
			System.out.println("패스워드 일치");
			model.addAttribute("user",user);
			view = "emp/mypage";//타임리프쓰니 서브메뉴로 로그인했을때 각 부서 정의해놓음
		}else {
			System.out.println("패스워드 불일치");
			view = "redirect:/emp/login.do";
		}

		/*
		암호화하기 전의 로그인
		if(user!=null) {
			//로그인성공
			model.addAttribute("user",user);
			view = "emp/mypage";//타임리프쓰니 서브메뉴로 로그인했을때 각 부서 정의해놓음
		}else {
			//로그인실패
			view = "redirect:/emp/login.do";
		}*/

		return view;
	}
	

	@GetMapping("/insert")
	public String insert(Model model) {
		//기존의 DeptServiceImpl의 셀렉트메소드를 호출해서 결과를 공유
		List<DeptDTO> deptlist = deptservice.select();
		model.addAttribute("deptlist",deptlist);
		return "emp/register";
	}
	@PostMapping("/insert")
	public String insertPage(MemberDTO member, HttpSession session) 
										throws IllegalStateException, IOException{
		//패스워드 암호화
		String encodedPass = passwordEncoder.encode(member.getPass());
		System.out.println("-----------"+encodedPass);

		//암호화된 패스워드 세팅
		member.setPass(encodedPass);


		System.out.println(member);
		//1. 파일업로드
		MultipartFile file = member.getUserImage();
		String path = WebUtils.getRealPath(session.getServletContext(), "/WEB-INF/upload");
		String storeFilename = fileuploadService.uploadFile(file);
		member.setProfile_photo(storeFilename);
		member.setGender("0");
		System.out.println(member);
		//2.디비에 저장하기
		service.insert(member);
		
		return "emp/register";
	}
	
}

member 매퍼 변경

DB수정


암호화된 패스워드가 등록되니 패스워드 길이 변경

입력결과


password자리에 암호화된 키 삽입됨

수업현황 및 기타

  • 팀프로젝트 진행으로 필요한 부분만 추출해서 수업해주심
  • spring security + redis(메모리 db) + kafka(비동기통신) 과정 끝나고 공부할 것 권장 => (프론트독립, 스케일아웃, MSA(서비스단위분리)로 보안처리 강화에 필요)
  • 암호화한 것은 복호화할 수 없음
  • 토큰과 세션..
  • 로그인정책
    • 사용자가 입력한 아이디 이용하여 사용자 조회
    • 사용자가 입력한 패스워드를 암호화하여 맵에 지정된 패스워드와 일치하는지 조회

본 포스팅은 멀티캠퍼스의 멀티잇 백엔드 개발(Java)의 교육을 수강하고 작성되었습니다.

0개의 댓글