스프링 - 회원 비밀번호 BcryptEncoding

jinvicky·2023년 2월 5일
0

2023 Spring Project TIL

목록 보기
5/32

시큐리티를 해보고 싶었는데 초반 설정부터 대차게 실패했다. 플젝만 몇개 날렸는지 모른다.
갑자기 코틀린 classNotFound 에러가 나길래 진짜..하고 때려쳤다.

https://12716.tistory.com/entry/Spring-security%EB%B9%84%EB%B0%80%EB%B2%88%ED%98%B8-%EC%95%94%ED%98%B8%ED%99%94
대신 위 사이트를 보고 패스워드 인코딩을 시도해보았다.
이것도 시큐리티의 일종이라 시큐리티 설정 추가가 어느 정도 필요하다.

  1. 설정
    pom.xml에 security-web 의존성 태그를 추가한다.
<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-web</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>

/WEB-INF/spring/appServlet 안에 security-context.xml 파일을 추가한다.
사실 /spring 안 인지 /appServlet 안 인지는 중요하지 않다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="bcryptPasswordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />

</beans>

왜냐하면 web.xml에서 경로만 잘 넣으면 되기 때문이다. 사이트마다 폴더 경로가 아주 조금 달라서
지레 겁먹었었다.ㅋㅋㅋ 기존에 존재하는 태그 내부의 에 한 줄 더 추가하는 것이다.

<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/spring/root-context.xml
		/WEB-INF/spring/appServlet/security-context.xml
		</param-value>
	</context-param>

이제 컨트롤러에서 입력한 패스워드를 받아서 BCrypt 인코딩을 해보자.

package com.fastcampus.ch4.controller;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

import javax.servlet.http.HttpServletRequest;

@Controller
public class PwdController {

  @Autowired //전 플젝에서는 @Autowired를 안 썼던데 그러면 주입을 어떻게 받은거지???
  BCryptPasswordEncoder passwordEncoder;

  @GetMapping("/register")
  public String register() {
      return "input";
  }

  @PostMapping("/register")
  public String register(HttpServletRequest request) {
      String pwd = request.getParameter("pwd");
      System.out.println("pwd ::: "+ pwd);
      String encodedPwd = passwordEncoder.encode(pwd);

      System.out.println("인코딩:: --------" + encodedPwd);
      return "redirect:/";
  }
}

@Autowired를 BCryptPasswordEncoder passwordEncoder;에 붙이지 않으면
form으로 제대로 패스워드를 넘겨주어도 NullPointerException이 뜬다.
pwd가 제대로 들어왔는데 sysout으로 확인하니까 문제 범위가 좁혀졌다.

입력화면은 초간단으로 구성했다. 다만 복붙하는데 덜렁이인지라 utf-8 설정태그를 빼먹기도 한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
		 pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
	<title>Home</title>
</head>
<body>
<h1>
	Hello world!  
</h1>


<form action="/register" method="post">

	<input type="text" name="pwd" placeholder="비밀번호 등록">
	<button type="submit">등록</button>

</form>
</body>
</html>

걍 초간단 패스워드 넘기기용 Form이다.

이렇게 하면 아래처럼 인코딩된 패스워드가 뜬다.

이제 비밀번호를 비교하는 방법을 공부해봐야겠다.
내가 아는 이론으로는 입력받은 패스워드의 해시값?과 인코딩한 디비의 패스워드의 해시값을 비교해서
같으면 동일한 유저라고 하던데 이제 해봐야 한다.

profile
Front-End와 Back-End 경험, 지식을 공유합니다.

0개의 댓글

관련 채용 정보