🔥스파르타 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 객체에 담아 클라언트에 응답하게 된다.🖐️🖐️