엘리스트랙
2차 프로젝트 로그인 기능 구현!
Zmann
2024. 3. 3. 19:43
728x90
프로젝트가 csr이기 때문에 jwt로 토큰을 발급 받아서 세션 스토리지에 저장해 주는 방식으로 했다.
@PostMapping("/sign-in")
public ResponseEntity<?> login(@RequestBody SignInDto signInDto) {
User user = userService.authenticate(signInDto.getEmail(), signInDto.getPassword());
if (user != null) {
String jwt = userService.generateJwtToken(user);
Map<String, Object> response = new HashMap<>();
response.put("token", jwt);
response.put("isAdmin", user.isAdmin());
response.put("id", user.getId());
return new ResponseEntity<>(response, HttpStatus.OK);
}
return new ResponseEntity<>("Invalid email or password", HttpStatus.UNAUTHORIZED);
}
먼저 authenticate로 입력받은 아이디와 비밀번호가 맞는 정보인지 확인해 주었다.
public User authenticate(String email, String password) {
User user = userRepository.findByEmail(email);
if (user != null && passwordEncoder.matches(password, user.getPassword())) {
return user;
}
return null;
}
유저가 존재한다면 토큰을 생성해 주었다.
public String generateJwtToken(User user) {
return Jwts.builder()
.setSubject(user.getEmail())
.claim("isAdmin", user.isAdmin()) // isAdmin 정보 추가
.setIssuedAt(new Date())
.signWith(key)
.compact();
}
토큰, 어드민 정보, 유저 아이디를 서버에 보내주면
try {
const data = { email, password };
const result = await Api.post("/users/sign-in", data);
const { token, isAdmin, id } = result;
// 로그인 성공, 토큰을 세션 스토리지에 저장
sessionStorage.setItem("token", token);
sessionStorage.setItem("id", id);
alert(`정상적으로 로그인되었습니다.`);
// 로그인 성공
// admin(관리자) 일 경우, sessionStorage에 기록함
if (isAdmin) {
sessionStorage.setItem("admin", "admin");
}
// 기존 다른 페이지에서 이 로그인 페이지로 온 경우, 다시 돌아가도록 해 줌.
const { previouspage } = getUrlParams();
if (previouspage) {
window.location.href = previouspage;
return;
}
// 기존 다른 페이지가 없었던 경우, 그냥 기본 페이지로 이동
window.location.href = "/";
} catch (err) {
console.error(err.stack);
alert(`문제가 발생하였습니다. 확인 후 다시 시도해 주세요: ${err.message}`);
}
세션 스토리지에 저장해 사용할 수 있게 된다.
728x90