서론
프로젝트를 진행하면서 권한별로 회원가입을 처리하는 로직이 있었습니다.
초기에는 코드에 토큰을 저장해 두고, 관리자가 회원가입 시 이 토큰을 입력하면 관리자로 가입될 수 있도록 구현했습니다. 관리자는 이 토큰을 알고 있기 때문에 해당 토큰을 입력하면 자동으로 관리자 권한으로 가입되는 방식이었습니다.
위 토큰 명은 예시입니다.
하지만 코드에 토큰 값을 저장하는 것은 보안상 큰 문제가 될 수 있으므로, 보안 처리가 필요합니다.
구글 검색과 튜터님과의 상담 결과, Jasypt 라이브러리를 사용하거나, 토큰을 코드에 저장하지 않고 관리자와 사용자의 회원가입 로직을 분리하는 것이 최선의 해결책이라는 결론에 도달했습니다.
현재 문제는 사용자와 관리자의 회원가입 로직이 동일한 비즈니스 로직을 사용하기 때문에 발생했습니다. 따라서, 관리자와 사용자의 비즈니스 로직을 분리하기로 결정했습니다.
비즈니스 로직 분리
토큰을 사용하지 않고 비즈니스 로직을 분리하려면 초기 관리자가 필요합니다.
따라서 데이터베이스 초기 설정 시 "관리자" 권한으로 데이터를 저장하고, 해당 관리자가 로그인하면 JWT 토큰을 발급받습니다. 이후, 이 토큰을 헤더에 저장하고 사용하여 인증을 요청합니다.
@PostMapping("/create-admin")
public ResponseEntity<String> createManager(@AuthenticationPrincipal UserDetailsImpl userDetails, @Valid @RequestBody SignupRequestDto signupRequestDto) {
// 비즈니스 로직 생략
// 역할에 따른 메시지 선택
String message;
if (signupRequestDto.getRole() == UserRoleEnum.MANAGER) {
message = "매니저 생성 완료 :)";
} else if (signupRequestDto.getRole() == UserRoleEnum.MASTER) {
message = "마스터 생성 완료 :)";
} else {
message = "계정 생성 완료 :)";
}
return ResponseEntity.ok(message);
} catch (IllegalArgumentException e) {
return ResponseEntity.badRequest().body(e.getMessage());
}
}
로그인한 초기 관리자의 토큰을 확인하여 관리자인지 확인한 후, 인증이 완료되면 @AuthenticationPrincipal 어노테이션을 사용하여 현재 인증된 사용자의 UserDetailsImpl 객체를 메소드 파라미터로 주입받습니다.
이렇게 주입된 UserDetailsImpl 객체를 서비스 계층으로 전달하여 나머지 로직을 처리하면, 관리자 및 매니저의 회원가입을 허용할 수 있습니다.
Jasypt 라이브러리는 추후에 따로 공부를 해야겠다🤔
'TIL,일일 회고' 카테고리의 다른 글
[TIL, 일일 회고] 2024.08.29 - UserDetails와 getAuthorities() 메서드 이해하기 (0) | 2024.08.29 |
---|---|
[TIL, 일일 회고] 2024.08.28 - Git 브랜치 전환 시 파일이 계속 보이는 이유와 해결 방법 (0) | 2024.08.28 |
[TIL, 일일 회고] 2024.08.26 - @Pattern 사용 (0) | 2024.08.26 |
[TIL, 일일 회고] 2024.08.25 - 랜덤 시크릿 키 생성 방법 (openssl rand) (0) | 2024.08.25 |
[TIL, 일일 회고] 2024.08.24 - 외래 키 주인❗️ (1) | 2024.08.24 |