🔥스파르타 TIL (Spring)

JWT 활용하기 (2) - 회원 가입, 로그인 기능 만들기

승승장규 2025. 2. 13. 09:22

회원 가입 기능을 구현하기에 앞서 JWT 관련해서 간단한 설정들을 알아보자

 

JWT 활용하기 (1)

인증(Authentication)과 인가(Authorization) 란? 인증(Authentication)과 인가(Authorization) 란?인증 ▼해당 유저가 실제 유저인지 인증하는 개념지문인식, 로그인 등 실제 유저가 맞는지 확인하는 장치인가 ▼

seungg8361.tistory.com

 

1. Entity 클래스 만들기

@Entity
@Getter
@Setter
@NoArgsConstructor // 기본 생성자 생성
@Table(name="users") // 테이블 이름
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false, unique = true)
    private String username;

    @Column(nullable = false)
    private String password;

    @Column(nullable = false, unique = true)
    private String email;

    @Column(nullable = false)

    // EnumType을 데이터베이스 컬럼에 저장할 때 사용.
    // 사용하면 enum의 이름 그대로 데이터베이스에 저장 ex) USER -> USER
    @Enumerated(value = EnumType.STRING)
    private UserRoleEnum role;

 

2. Repository 인터페이스 만들기

public interface UserRepository extends JpaRepository<User, Long> {
    Optional<User> findByUsername(String username);
    Optional<User> findByEmail(String email);
}

 

3. Service 클래스에 회원 가입 기능 만들기

    public void signup(SignupRequestDto requestDto) {
        String username = requestDto.getUsername();
        String password = passwordEncoder.encode(requestDto.getPassword());

        // 회원 중복 확인
        Optional<User> checkUsername = userRepository.findByUsername(username);
        if (checkUsername.isPresent()) {
            throw new IllegalArgumentException("중복된 사용자가 존재합니다.");
        }

        // email 중복확인
        String email = requestDto.getEmail();
        Optional<User> checkEmail = userRepository.findByEmail(email);
        if (checkEmail.isPresent()) {
            throw new IllegalArgumentException("중복된 Email 입니다.");
        }

        // 사용자 ROLE 확인
        UserRoleEnum role = UserRoleEnum.USER;
        if (requestDto.isAdmin()) {
            if (!ADMIN_TOKEN.equals(requestDto.getAdminToken())) {
                throw new IllegalArgumentException("관리자 암호가 틀려 등록이 불가능합니다.");
            }
            role = UserRoleEnum.ADMIN;
        }

        // 사용자 등록
        User user = new User(username, password, email, role);
        userRepository.save(user);
    }

    public void login(LoginRequestDto requestDto, HttpServletResponse res) {
        String username = requestDto.getUsername();
        String password = requestDto.getPassword();

        // 사용자 확인
        User user = userRepository.findByUsername(username).orElseThrow(
                () -> new IllegalArgumentException("등록된 사용자가 없습니다.")
        );

        // 비밀번호 확인
        if (!passwordEncoder.matches(password, user.getPassword())) {
            throw new IllegalArgumentException("비밀번호가 일치하지 않습니다.");
        }

        // JWT 생성 및 쿠키에 저장 후 Response 객체에 추가
        String token = jwtUtil.createToken(user.getUsername(), user.getRole());
        jwtUtil.addJwtToCookie(token, res);
    }
}

 

4. Controller 클래스에 회원 가입, 로그인 기능 만들기

@PostMapping("/user/signup")
    public String signup(@Valid SignupRequestDto requestDto){
        userService.signup(requestDto);

        return "redirect:/api/user/login-page";
    }
    
    @PostMapping("/user/login")
       public String login(LoginRequestDto requestDto, HttpServletResponse res){
           try{
              userService.login(requestDto, res);
           }catch(Exception e){
             return "redirect:/api/user/login-page?error";
           }
           
           return "redirect:/";
    }

 

 

 

 

회원가입을 완료한 뒤 로그인을 시도하면

JWT 를 생성해서 Cookie에 저장 후 Response 객체에 담아 클라언트에 응답하게 된다.🖐️🖐️