해당 API는 로컬에서 회원가입 및 로그인을 해볼 수 있도록 구성되어 있습니다.
회원가입시 휴대전화번호를 기준으로 인증이 필요하며 인증 절차를 거치지 않은 번호는 회원가입 할 수 없도록 되어있습니다.
로그인시 JWT로 생성된 AccessToken과 RefreshToken이 발급되며 AccessToken은 5분의 유효기간을 가지고, RefreshToken은 10일간의 유효기간을 가집니다.
발급된 토큰으로 통신을 진행할 수 있으며 HttpHeader에 X-AUTH-TOKEN : Bearer 엑세스 토큰 형태로 AccessToken을 넣어주어야 합니다.
AccessToken이 만료되었을 경우 RefreshToken을 X-REFRESH-TOKEN : Bearer 리프레시 토큰 형태로 AccessToken과 함께 보내주면 새로 발급된 토큰을 만들어줍니다.
해당 프로젝트 경로에서 Terminal (cmd) 실행
./gradlew clean build
java -jar ./build/libs/LoginApi-0.0.1-SNAPSHOT.jar
실행에 성공하면 7777번 포트로 서버가 동작합니다.
/swagger로 진입하면 swagger를 이용한 API 테스트를 진행할 수 있습니다./h2-console로 진입하면 H2 Database를 확인할 수 있습니다.
H2 계정 정보
JDBC URL : jdbc:h2:mem:spring_assignments;MODE=MYSQL;
User Name : sa
Password :
-
HttpHeader에 AccessToken 추가 방법
Authorize를 클릭 후 X-AUTH-TOKEN의 input에Bearer 엑세스토큰을 입력하고 Authorize를 합니다. -
HttpHeader에 RefreshToken 추가 방법
Authorize를 클릭 후 X-REFRESH-TOKEN의 input에Bearer 리프레시토큰을 입력하고 Authorize를 합니다.
Java 17, SpringBoot 2.7.2를 기반으로 프로젝트를 구성하였습니다.
데이터베이스는 따로 설치하거나 셋팅할 필요 없이
인메모리 DB인 H2 Database와 Embedded-Redis로 어디서든 동일하게 테스트 할 수 있게 작성되었습니다.
모든 API는 application/json의 형태로 요청 및 응답을 진행합니다.
API의 응답 형태는 아래의 예시 형태를 사용합니다.
{
"success": true,
"response": {
"Data": "example"
},
"error": null
}{
"success": true,
"response": true,
"error": null
}{
"success": false,
"response": null,
"error": {
"status" : "400",
"message" : "닉네임은 필수 입력 값입니다."
}
}POST : /api/member/join
- 필수 조건
- 전화번호 인증 필수!
- 이메일, 닉네임, 전화번호가 중복되지 않을 것!
{
"email":"tt@tester.com",
"name":"테스터",
"passwd":"1q2w3e4r!@",
"nickname":"테스터입니다",
"phoneNum":"010-1234-5678"
}POST : /api/member/login
- 필수 조건
- 아이디(이메일), 비밀번호 필수!
{
"email":"tester@tester.com",
"passwd":"1234"
}PUT : /api/member/passwdReset
- 필수 조건
- 전화번호 인증 필수!
- 아이디(이메일), 비밀번호, 전화번호 필수!
{
"email" : "tester@tester.com",
"phoneNum" : "010-0000-0000",
"newPasswd" : "1q2w3e4r!@"
}GET : /api/member/myProfile
- 필수 조건
- AccessToken 필수!
HttpHeader에 AccessToken 아래의 형태로 추가
X-AUTH-TOKEN : Bearer AccessToken
POST : /api/auth/sendAuth
해당 API는 회원가입, 비밀번호 재설정시 반드시 선행되어야 하는 API입니다. 실제 SMS발송으로 연동하지 않아서 임시로 응답에 인증번호를 보내도록 되어있습니다. 해당 인증번호를 전화번호 인증번호 검증에 입력해주어야 합니다.
- 필수 조건
- 전화번호 필수!
{
"phoneNum": "010-0000-0000"
}POST : /api/auth/validAuth
- 필수 조건
- 전화번호, 인증번호 필수!
{
"phoneNum": "010-0000-0000",
"authCode": "1234"
}POST : /api/auth/refresh
- 필수 조건
- AccessToken 필수!
- RefreshToken 필수!
HttpHeader에 AccessToken, RefreshToken을 아래의 형태로 추가
X-AUTH-TOKEN : Bearer AccessToken
X-REFRESH-TOKEN : Bearer RefreshToken
-
Json Web Token
로그인 과정에서 발생하는JWT에 대한 부분을 가장 많이 신경썼습니다.
유저의 정보를 지속적으로 서버에 저장하지 않아도 되도록JWT를 이용하여 서버는 유저의 정보를 검증만 하도록 진행하였습니다.
AccessToken만 사용한다면 토큰이 탈취되었을 때 탈취자가 악의적인 이용을 지속적으로 할 수 있기 때문에RefreshToken을 이용하여 이 부분을 방어하기 위한 설계를 진행하였습니다.
RefreshToken은 Redis에 10일정도 저장이 되고 해당 토큰을 이용하여AccessToken이 재발급 되면RefreshToken또한 재발급이 되도록 하여 탈취자가 해당 토큰들을 탈취하더라도 지속적인 토큰 재발급으로 문제가 발생할 소지를 최소화 하였습니다. -
전화번호 인증
전화번호 인증의 경우는 SMS발송으로 연계해야하지만 서비스를 직접 연결하지 않고 임시로 랜덤으로 생성된 숫자를 응답에 보여주도록 하였습니다.
생성된 숫자는 전화번호를 기준으로Redis에 저장이 되며 3분간의 유효기간을 갖습니다.
해당 숫자로 인증이 완료되면 동일하게Redis에 인증 완료 정보가 저장되고 1일간의 유효기간을 갖습니다.
인증이 완료된 상태로 회원가입이나 비밀번호 재설정을 진행하면 인증 완료 정보는 제거가 되어 다시 인증이 필요한 상태로 됩니다. -
동일한 경험 추구
환경에 구애받지 않고 테스트 환경을 구축해 볼 수 있도록 하기 위하여 인메모리 DB를 사용하였습니다.
일반적인 데이터베이스는 특정한 DB서버가 있어야 테스트등이 진행이 되지만H2와Embedded-Redis를 통해 서비스가 올라갈때 임시로 사용되는 데이터베이스를 구축하여 자바가 설치된 환경이라면 어디서든 해당 서비스를 테스트 할 수 있게 구축하였습니다.