시작하며
이번에는 로그인을 하는 과정을 구현해 볼려고 한다. 로그인을 하는 방법은 다양하다. 요즘 Oauth2.0이 가장 유행한다고 한다. 앱개발을 하게되면 Oauth2.0을 통해 구현해볼려고 한다. 이번에는 JWT를 통해 구현해보았다.
ㅂ저번에 회원 가입을 할 때, 회원가입한 비밀번호를 JWT로 암호해서 저장하였다. 이제 로그인 할 때 JWT를 통해 비밀번호를 decrypt한 다음에 해석해서 회원가입 테이블에 있으면 로그인을 시켜주는 형식으로 구현해보았다.
Model 패키지
PostLoginReq : 로그인할 때 요청할 요소들의 집합이다. email가 비밀번호르 통해 로그인 할려고 한다.
package com.example.delivery.src.user.moedl;
import lombok.*;
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class PostLoginReq {
private String email;
private String password;
}
PostLoginRes : 요청에 대한 결과에 담길 요소이다.
package com.example.delivery.src.user.moedl;
import lombok.*;
@Getter
@Setter
@AllArgsConstructor
public class PostLoginRes {
private int userIdx;
private String jwt;
}
UserController
제일 처음 요청을 받고 마지막에 요청을 보내주는 부분이다.
/**
* 로그인 API
* [POST] /users/logIn
*/
@ResponseBody
@PostMapping("/log-in")
public BaseResponse<PostLoginRes> logIn(@RequestBody PostLoginReq postLoginReq) throws BaseException {
//상태가 비활성 상태이면 로그인 할 수 없다.
if(userProvider.checkStatus(postLoginReq.getEmail()) != 1){
return new BaseResponse<>(NO_STATUS);
}
try{
PostLoginRes postLoginRes =userProvider.login(postLoginReq);
return new BaseResponse<>(postLoginRes);
}catch(BaseException exception){
return new BaseResponse<>(exception.getStatus());
}
}
이메일을 통해 상태가 비활성인지 체크해 상태가 비활성이면 휴면계정이므로 로그인 할 수 없게 했다.
UserProvide
public PostLoginRes login(PostLoginReq postLoginReq) throws BaseException {
User user = userDao.getPwd(postLoginReq);
String password;
try{
//password 암호화 풀기
password = new AES128(Secret.USER_INFO_PASSWORD_KEY).decrypt(user.getPassword());
}catch (Exception exception) {
throw new BaseException(PASSWORD_DECRYPTION_ERROR);
}
//입력한 암호가 일치하는지 검사
if(postLoginReq.getPassword().equals(password)){
int userIdx = userDao.getPwd(postLoginReq).getUserIdx();
String jwt = jwtService.createJwt(userIdx);
return new PostLoginRes(userIdx,jwt);
}else{
throw new BaseException(FAILED_TO_LOGIN);
}
}
비밀번호의 암호를 풀고 입력한 암호와 일치하는지 검사를 실행하는 부분이다.
UserDao
//상태 검사
public String checkStatus(String email){
String checkStatus = "select status from User where email = ?";
return this.jdbcTemplate.queryForObject(checkStatus, String.class, email);
}
//비밀번호 받아오기
public User getPwd(PostLoginReq postLoginReq) {
String getPwdQuery = "select userIdx, email, password, name, phoneNumber, Birth from User where email = ?";
String getPwdParams = postLoginReq.getEmail();
return this.jdbcTemplate.queryForObject(getPwdQuery,
(rs, rowNum) -> new User(
rs.getInt("userIdx"),
rs.getString("email"),
rs.getString("password"),
rs.getString("name"),
rs.getString("phoneNumber"),
rs.getString("Birth")
),
getPwdParams
);
}
데이터베이스에 직접적인 데이터를 요구하는 부분이다. 여기서 받아온 데이터를 다시 Provide에 전송해 일치하는지 검사한다.
실행 결과
- 알맞은 이메일과 비밀번호 입력

- 비활성화 상태일 경우

'혼자하는 프로젝트 > 배달의 민족 클론코딩' 카테고리의 다른 글
레스토랑 관리 - 레스토랑 등록 (0) | 2022.12.19 |
---|---|
유저관리 - 회원정보 변경 및 조회 (0) | 2022.12.19 |
유저 관리 - 회원 가입 (0) | 2022.12.14 |
유저 관리 - 준비 단계 (0) | 2022.12.14 |
데이터베이스 소개 (0) | 2022.12.14 |