백엔드 개발/Spring&JPA

[Spring Data JPA] 로그인 기능 구현(2) - Password Encode

태기 2024. 6. 25. 17:37

개요

2024.06.24 - [백엔드 개발/Spring&JPA] - [Spring boot & JPA] 로그인 기능 구현

 

[Spring boot & JPA] 로그인 기능 구현

1. 개발환경 (프로젝트 생성) - Project : Gradle - Groovy- Language : Java- Spring Boot : 3.3.1- Project Metadata   * Group : com.example   * Artifact / Name : auth     * Packaging : Jar    * Java : 17- Dependencies    * Spring Web    

taek2.tistory.com

 

앞의 '로그인 기능 구현' 포스팅에서는 단순히 아이디와 비밀번호를 저장해서 비밀번호 매칭 후 로그인 성공 또는 실패를 알려주는 API를 구현하였다.

하지만 비밀번호를 그대로 DB에 저장하게 된다면, 치명적인 개인정보 유출이 일어날 수 있다.

따라서 비밀번호를 암호화하여 저장하는 로직을 구현해보겠다.

 

기능 구현

Config 수정

<SecurityConfig.java>

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    ...
    		.requestMatchers("/login", "/register").permitAll()	// /register 추가
    ...
}

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

securityFilterChain 메서드 안에 requestMatchers에 /register 권한을 추가한다.

 

passwordEncoder 메서드를 Bean에 등록한다.

 

DTO 생성

<RegisterRequest.java>

package com.example.auth.dto;

import lombok.Data;

@Data
public class RegisterRequest {
    private String registerId;
    private String registerPw;
}

회원가입 DTO를 생성한다.

 

Entity 수정

<Member.java>

@RequiredArgsConstructor
public class Member {
    ...
    private String password;

    public void toEntity(String id, String pw) {
        this.memberId = id;
        this.password = pw;
    }
}

@RequiredArgsConstructor 어노테이션 추가.

 

엔티티를 생성해주는 toEntity메서드를 추가해주었다.

 

Service 수정

<MemberService.java>

@Service
public class MemberService {
    ...
    @Autowired PasswordEncoder passwordEncoder;

    public boolean validateMember(LoginRequest loginRequest) {
        ...
        return passwordEncoder.matches(loginRequest.getPw(), member.getPassword());
    }

    public void registerMember(RegisterRequest registerRequest) {
        Member member = new Member();
        member.toEntity(registerRequest.getRegisterId(), passwordEncoder.encode(registerRequest.getRegisterPw()));
        memberRepository.save(member);
    }
}

PasswordEncoder 객체를 생성해준다.

 

validateMember 메서드에서 비밀번호 검증 로직을 수정해준다. 

passwordEncoder에서 제공해주는 matches 메서드를 통해 비밀번호 검증을 한다. 

 

추가로 회원가입하는 registerMember 메서드를 구현한다.

 

Controller 추가

<MemberController.java>

@PostMapping("/register")
public String register(@RequestBody RegisterRequest registerRequest) {
    memberService.registerMember(registerRequest);
    return "Registered successfully";
}

/login 아래에 추가해준다.

 

검증

회원가입 요청

- URL : http://localhost:8080/register

- Method : POST

- Body : raw, JSON 형식 

- json

{
   "registerId": "admin",
   "registerPw": "1234"
}

DB에 저장된 값을 확인해보면, 

다음과 같이 암호화되어서 저장된 것을 확인할 수 있다.

 

로그인 검증

- URL :  http://localhost:8080/login

- Method : POST

- Body : raw, JSON 형식 

- json

{
   "id": "admin",
   "pw": "1234"
}

로그인도 마찬가지로 success가 뜨면 암호화된 비밀번호로 로그인 검증까지 하였다.

 

다음으로는 JWT를 적용시켜 보안을 강화시켜보자.