테스트 구현은 완료하고 다시 복기하며 생겼던 문제에 대해서 정리해보려고 한다.
○ 회원가입 아키텍쳐
○ 유저 정보 저장을 위한 Entity
public class JwtUser {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String password;
private String role;
}
○ 회원가입을 위한 JoinService 생성
public Boolean joinProcess(JoinDto joinDto){
String username = joinDto.getUsername();
String password = joinDto.getPassword();
Boolean isExist = userRepository.existsByUsername(username);
if(isExist) {
return false;
}
JwtUser user = new JwtUser();
user.setUsername(username);
user.setPassword(bCryptPasswordEncoder.encode(password));
user.setRole("ROLE_ADMIN");
userRepository.save(user);
return true;
}
○ 회원가입 JoinController
public class JoinController {
private final JoinService joinService;
public JoinController(JoinService joinService){
this.joinService = joinService;
}
@PostMapping("/join")
public String joinProcess(JoinDto joinDto){
joinService.joinProcess(joinDto);
return "OK";
}
}
// 이 당시 user.setRole에서 "ROLE_ADMIN"이 아닌 "ADMIN"으로 설정해줬었다.
// 하지만 이렇게 작성했을때 토큰이 정상적으로 검증되지 않았는데 두 방식의 차이에서 나타나는 오류였다.
ROLE_ 접두사 사용 ("ROLE_ADMIN")
- ROLE_ 접두사는 Spring Security와 같은 보안 프레임워크에서 역할 이름을 구분하는 데 사용되는 표준
- 예를 들어, Spring Security에서는 사용자의 권한(role)을 나타낼 때 ROLE_ 접두사를 붙여서 저장하는 것이 일반적
- 이 방식은 역할을 다른 일반적인 문자열과 구분할 수 있음
접두사 없이 사용 ("ADMIN")
- 더 간단하고 자유로운 형태입니다. 보통은 역할을 저장하는 데 있어 단순한 문자열을 사용하는 경우
- ADMIN, USER, MODERATOR와 같이 역할을 정의할 수 있으며, ROLE_ 접두사를 붙이지 않는 경우
- 보안 프레임워크에 의존하지 않고 자체적인 역할 관리 방식을 사용하는 경우 이와 같은 형식 사용
즉 Spring Security 프레임워크를 사용하는 시스템에서 표준을 어겼기 때문에 생겨나는 오류였다.
public enum MemberRole {
USER("ROLE_USER", "일반 사용자"),
OWNER("ROLE_OWNER", "음식점 점주"),
ADMIN( "ROLE_ADMIN", "시스템 관리자")
;
private final String role;
private final String description;
}
TableQ를 제작했던 소스코드로 ENUM 사용할 때 역시 ROLE_ 접두사를 사용한 게 보인다.
당시 본인이 구현했던 내용이 아니라 이 부분을 놓쳤는데 확실히 뇌에 박혔다.
'Java > SpringBoot' 카테고리의 다른 글
JWT 로그인 테스트-4 (0) | 2025.01.22 |
---|---|
JWT 로그인 테스트-2 (0) | 2025.01.19 |
JWT 로그인 테스트-1 (0) | 2025.01.19 |