회원 가입 API
이메일, 아이디, 비밀번호, 이름, 핸드폰 번호, 생일을 입력 받아 비밀번호를 암호화 한 뒤 데이터베이스에 넣어 회원가이입을 성공 시킨다.
model 패키지
DB에 받아야 할 내용들을 대해 객체를 만든다.
- PostUserReq : 유저 내용 저장
package com.example.delivery.src.user.moedl;
import lombok.*;
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class PostUserReq {
private String email;
private String password;
private String name;
private String phoneNumber;
private String Birth;
}
- PostUserRes : 유저 내용에 대한 결과
package com.example.delivery.src.user.moedl;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@AllArgsConstructor
public class PostUserRes {
private int userIdx;
private String jwt;
}
JAVA FILE
- UserController : 제일 처음 request를 받음
@ResponseBody
@PostMapping("/sign-up")
public BaseResponse<PostUserRes> createUser(@RequestBody PostUserReq postUserReq){
if(postUserReq.getEmail() == null){ //Email이 비어 있는지 검사
return new BaseResponse<>(POST_USERS_EMPTY_EMAIL);
}
if(!isRegexEmail(postUserReq.getEmail())){ //Email이 양식에 맞는지 검사
return new BaseResponse<>(POST_USERS_INVALID_EMAIL);
}
try{
PostUserRes postUserRes = userService.createUser(postUserReq);
return new BaseResponse<>(postUserRes);
} catch (BaseException exception) {
return new BaseResponse<>((exception.getStatus()));
}
}
- UserProvider : 이메일 체크
//이메일이 중복인지 체크 Provider에 Select를 하는 함수를 만든다
public int checkEmail(String email) throws BaseException{
try {
return userDao.checkEmail(email);
} catch (Exception exception) {
throw new BaseException(DATABASE_ERROR);
}
}
- UserService : 적절한 형식 및 페스워드 암호화(jwt)
public PostUserRes createUser(PostUserReq postUserReq) throws BaseException {
//이메일이 있는지 검사
if(userProvider.checkEmail(postUserReq.getEmail()) == 1){
throw new BaseException(BaseResponseStatus.POST_USERS_EXISTS_EMAIL);
}
String pwd;
try{
//페스워드를 암호화한다.
pwd = new AES128(Secret.USER_INFO_PASSWORD_KEY).encrypt(postUserReq.getPassword());
postUserReq.setPassword(pwd);
}catch(Exception ignored){
throw new BaseException(BaseResponseStatus.PASSWORD_ENCRYPTION_ERROR);
}
try {
int userIdx = userDao.createUser(postUserReq);
//jwt 생성
String jwt = jwtService.createJwt(userIdx);
return new PostUserRes(userIdx, jwt);
} catch (Exception exception) { // DB에 이상이 있는 경우 에러 메시지를 보냅니다.
throw new BaseException(DATABASE_ERROR);
}
}
- UserDao
public int createUser(PostUserReq postUserReq){
String createUserQuery = "insert into User (email, password, name, phoneNumber, Birth) VALUES (?,?,?,?,?)";
Object [] createUserParams = new Object[]{postUserReq.getEmail(), postUserReq.getPassword(), postUserReq.getName(), postUserReq.getPhoneNumber(),
postUserReq.getBirth()};
this.jdbcTemplate.update(createUserQuery,createUserParams);
String lastInsertIdQuery = "select last_insert_id()";
return this.jdbcTemplate.queryForObject(lastInsertIdQuery,int.class);
}
//이메일 확인
public int checkEmail(String email){
String checkEmailQuery = "select exists(select email from User where email = ?)";
String checkEmailParams = email;
return this.jdbcTemplate.queryForObject(checkEmailQuery,int.class,checkEmailParams);
}
실행 결과
트러블 슈팅
1. 첫번째 에러
위에 사진과 같은 에러가 발생 했다. 구글링을 해보니 jwt 토큰 parsing 중 발생한 에러이고 해당 문제는 jdk17 에서는 관련 모듈이 기본 참조되지 않아 에러가 발생한다고 한다.
- 해결방법
//build.grade에 이 코드를 추가해준다.
implementation group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.1'
2. 두번째 에러
포스트맨으로 Post를 보낼 시 403 Forbiden 에러가 발생했다.
JWT를 생성할 때 Security를 build.grade에 추가해 주었다.
Security를 추가하게 되면 기본적으로 csrf 공격에 대한 방지를 수행 한다.
csrf란? 공격자가 희생자의 권한을 도용하여 특정 웹 사이트의 기능을 실행 하게 할 수 있으며 이는 희생자의 의도와는 무관하게 이루어진다. 그렇기 때문에 GET은 가능하나 POST, PATCH등은 자동으로 막은 것이다.
- 해결 방법
package com.example.delivery;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@EnableWebSecurity
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors().and().csrf().disable();
}
}
csrf를 disable하게 설정해주었다.
'토이프로젝트 > 배달의 민족 클론코딩' 카테고리의 다른 글
레스토랑 관리 - 레스토랑 등록 (0) | 2022.12.19 |
---|---|
유저관리 - 회원정보 변경 및 조회 (0) | 2022.12.19 |
유저관리 - 로그인 (0) | 2022.12.16 |
유저 관리 - 준비 단계 (0) | 2022.12.14 |
데이터베이스 소개 (0) | 2022.12.14 |