반응형

Spring Security를 이용해 회원 관리나 로그인 기능을 구현할 때, 비밀번호를 평문(plain text)으로 저장하면 보안상 매우 취약합니다. 이번 글에서는 Spring Security에서 제공하는 BCryptPasswordEncoder를 사용하여 안전하게 비밀번호를 암호화하는 방법을 소개하겠습니다.

 

 

1. BCryptPasswordEncoder란?

BCryptPasswordEncoder는 Spring Security에서 제공하는 비밀번호 암호화 도구로, 단방향 해싱(hashing)을 수행합니다. 한번 암호화된 비밀번호는 복호화가 불가능하며, 로그인 시에는 입력된 비밀번호를 다시 암호화하여 데이터베이스에 저장된 암호화된 비밀번호와 비교하여 인증합니다.

주요 특징:

  • 단방향 암호화 방식
  • 안전한 salt 자동 생성 및 관리
  • 비밀번호 강도 조절 가능

 

2. BCryptPasswordEncoder 설정 방법

다음은 Spring 프로젝트에서 BCryptPasswordEncoder를 Bean으로 등록하는 예제입니다.

@Configuration
public class PasswordConfig {

    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

위 코드에서 @Configuration 어노테이션은 Spring에게 이 클래스가 설정 클래스임을 알려줍니다. 그리고 @Bean어노테이션을 사용하여 BCryptPasswordEncoder 인스턴스를 Spring의 관리 대상(Bean)으로 등록합니다.

 

3. 회원가입에서 사용 방법

회원가입 시 사용자의 비밀번호를 암호화하여 저장하려면 아래와 같이 작성합니다.

@Autowired
private BCryptPasswordEncoder passwordEncoder;

public void registerUser(User user) {
    String encodedPassword = passwordEncoder.encode(user.getPassword());
    user.setPassword(encodedPassword);
    userRepository.save(user);
}

 

4. 로그인 시 비밀번호 검증 방법

로그인 시 비밀번호를 검증할 때는 사용자가 입력한 비밀번호와 데이터베이스에 저장된 암호화된 비밀번호를 비교합니다.

@Autowired
private BCryptPasswordEncoder passwordEncoder;

public boolean authenticate(String rawPassword, String encodedPassword) {
    return passwordEncoder.matches(rawPassword, encodedPassword);
}

 

5. 주의사항

  • 절대 비밀번호를 평문으로 저장하지 말기!
  • strength 파라미터를 통해 암호화 강도를 조절할 수 있지만, 기본값(10)이 일반적인 환경에서 충분!
  • 성능이 매우 중요한 환경이라면 암호화 강도를 적절히 설정할 것!

마무리

지금까지 Spring Security의 BCryptPasswordEncoder를 활용한 안전한 비밀번호 관리 방법을 알아봤습니다. 이를 통해 애플리케이션 보안을 강화하고 사용자 정보를 안전하게 보호할 수 있습니다.

반응형

'Spring Boot > 스프링부트 예제' 카테고리의 다른 글

답변형 게시판 구현 (3)  (0) 2023.10.27
답변형 게시판 구현 (2)  (1) 2023.10.27
답변형 게시판 만들기 (1)  (1) 2023.10.26
QnA 다양한 검색 게시판 CRUD (1)  (1) 2023.10.24
게시판 페이징 처리  (1) 2023.10.23
반응형

💡 파라미터 방식

앞 전 예제에서는 쿼리스트링 방식으로 매개변수를 전달하였습니다. 이번에는 쿼리스트링 방식을 개선한 파라미터 방식의 매개변수 전달 방법에 대해 알아보겠습니다.

 

📂PathVariableController.java

@Controller
@RequestMapping("/exam05")
public class PathVariableController {
//    TODO : url 테스트 파라미터 방식 : http://localhost:8000/exam05/path-variable/LeeJunHyuk
//                                  => @GetMapping("/path-variable/{웹매개변수명}")
//                                  => 웹 브라우저 주소창 사용 : url/값
//    TODO : url 테스트 쿼리스트링 방식 : http://localhost:8000/exam05/path-variable?name=LeeJunHyuk
    @GetMapping("/path-variable/{name}")
    public String getPathVariable(
            @PathVariable String name,
            Model model)
    {
        model.addAttribute("name", name);
        return "exam05/path_variable.jsp";
    }
}

📂path_variable.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%--TODO : JSTL 표현식 사용을 위한 import--%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<%-- TODO : el 표현식--%>
    <p>${name}</p>
</body>
</html>

파라미터 형식의 매개변수 전달방법은

@GetMapping("url/{웹매개변수명}") 으로 사용하고 메소드 매개변수로 @PathVariable를 사용한 것을 알 수 있습니다.

 

📌 실행결과

반응형
반응형

💡 Lombok 라이브러리

Lombok 라이브러리는 유용한 어노테이션을 모은 라이브러리입니다.

다음 예제 실습을 위한 몇 가지 롬북 어노테이션을 소개합니다.

//   @Setter : setter 함수를 만들어주는 어노테이션
//   @Getter : getter 함수를 만들어주는 어노테이션
//   @ToString : toString 재정의 함수 자동으로 만들어주는 어노테이션
//   @AllArgsConstructor : 모든 속성을 가진 생성자 자동 정의 어노테이션

먼저 실습을 하기 위해 아래와 같이 폴더를 구성합니다.

com.example.controllerexam 폴더 아래에 model 폴더를 생성합니다.

📂 model > Member.java

package com.example.controllerexam.model;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;


@Setter
@Getter
@ToString
@AllArgsConstructor
public class Member {
//    TODO : 속성, 생성자 함수(getter/setter)
    String id;      // 회원 id
    String name;    // 회원 이름
}

Lombok 어노테이션을 사용함으로써 코드가 간결해집니다.

 

📂 ObjectParamController.java

package com.example.controllerexam.controller.exam04;

import com.example.controllerexam.model.Member;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * packageName : com.example.controllerexam.controller.exam04
 * fileName : ObjectParamController
 * author : GGG
 * date : 2023-10-05
 * description : @ModelAttribute : 객체 형태로 변환하는 어노테이션
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-10-05         GGG          최초 생성
 */
@Controller
@RequestMapping("/exam04")
public class ObjectParamController {
//    TODO : URL TEST ) http://localhost:8000/exam04/object-param?id=junyeoke&name=lee
//     @ModelAttribute : 객체의 속성명으로 jsp로 각각 전달
//     Member 클래스의 속성명 == url의 매개변수명 : id, name
    @GetMapping("/object-param")
    public String getObjectParam(
            @ModelAttribute Member member){
        return "exam04/object_param.jsp";
    }
}

 

 

@ModelAttribute는 사용자가 요청시 전달하는 값을 오브젝트 형태로 매핑해주는 어노테이션입니다.

 

📂 object_param.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%--TODO : JSTL 표현식 사용을 위한 import--%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<%--    TODO : 매개변수 받기 --%>
    <h2>매개변수 받기</h2>
    <p>${member}</p>
</body>
</html>

 

📌 결과출력

반응형

+ Recent posts