JJ Club 백엔드 - 인증/인가 서버(이하얀)
- 인증/인가 서버는 JWT 토큰을 기반으로 Spring Security를 이용하여 개발했습니다.
🔐 인증인가 관련 서버
Java 11
Spring Boot 2.6.8
Spring Data JPA
Spring Security
JWT 0.11.2
Lombok
MySQL 10.4.24
Redis
- 테스트는 http://Cap.jjclub.pe.kr:80 으로 진행하실 수 있습니다.
- 예시) 이메일 인증번호 발송 요청을 원하는 경우에 해당 주소로 post해주면 됩니다. http://Cap.jjclub.pe.kr:80/api/v1/auth/email
- 성공 응답의 경우 201은 커스텀한 응답값입니다. - 실패 응답의 경우 서버 에러에 해당하는 500 에러를 최소화하기 위해 400 커스텀 에러(자격 증명에 실패하였습니다)로 통일하고, Exception 형태로 어느 곳에서의 실패인지 구분하는 것으로 작성했습니다.
- 테스트 영상
Untitled.mp4
서비스 | Method | URL | 시큐리티 인증 |
---|---|---|---|
이메일 인증번호 발송 | POST | /api/v1/auth/email | X |
이메일 인증 | POST | api/v1/auth/verifyCode | X |
이메일 인증번호 재발급 | POST | /api/v1/auth/refreshCode | X |
회원가입 | POST | /api/v1/auth/signup | X |
로그인 | POST | /api/v1/auth/login | X |
로그아웃 | GET | /api/v1/auth/user/logout | O |
토큰 재발급 | POST | /api/v1/auth/reissue | O |
회원정보 조회 | GET | /api/v1/auth/user/me | O |
회원정보 수정 | PUT | /api/v1/auth/user/update | O |
회원탈퇴 | DELETE | /api/v1/auth/user/me2 | O |
{
"email": "dlgkdis801@jj.ac.kr" //인증받을 이메일 주소 입력
}
- 성공
- HTTP Status : 200 Ok
{
"result": "success",
"data": "send mail"
}
- 실패 시
- HTTP Status : 400 Bad Request
{
"timestamp": "2023-05-23T11:36:10.674+00:00",
"code": "4001102",
"error": "org.springframework.http.converter.HttpMessageNotReadableException",
"message": "자격 증명에 실패하였습니다."
}
{
"email": "dlgkdis801@jj.ac.kr",
"code": "254453" //실제 전송받은 코드 입력
}
- 성공
- HTTP Status : 200 Ok
{
"result": "success",
"data": "true" //DB의 코드와 입력받은 코드 일치 여부
}
- 실패
- HTTP Status : 400 Bad Request
{
"timestamp": "2023-05-23T11:36:35.273+00:00",
"code": "4001102",
"error": "org.springframework.http.converter.HttpMessageNotReadableException",
"message": "자격 증명에 실패하였습니다."
}
++추가
{
"email": "dlgkdis801@jj.ac.kr"
}
- 성공
- HTTP Status : 200 Ok
{
"result": "success",
"data": "reissue Email"
}
- 실패
- HTTP Status : 400 Bad Request
{
"timestamp": "2023-05-23T11:36:35.273+00:00",
"code": "4001102",
"error": "org.springframework.http.converter.HttpMessageNotReadableException",
"message": "자격 증명에 실패하였습니다."
}
{
"email":"dlgkdis801@jj.ac.kr",
"password":"1234",
"nickName" : "티티",
"phoneNumber" : "010-1234-5678"
}
- 성공
- HTTP Status : 201 Created
{
"result": "success",
"data": {
"email": "dlgkdis801@jj.ac.kr",
"userName": null,
"nickName": "티티",
"phoneNumber": "010-1234-5678",
"mbti": null
}
}
- 실패
- HTTP Status : 400 Bad Request
{
"timestamp": "2023-05-23T11:20:51.083+00:00",
"code": "4001102",
"error": "java.lang.RuntimeException",
"message": "자격 증명에 실패하였습니다."
}
{
"email":"dlgkdis801@jj.ac.kr", //가입한 이메일
"password":"1234" //가입한 비밀번호
}
- 성공
- HTTP Status : 201 Created
{
"result": "success",
"data": {
"grantType": "bearer",
"accessToken": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiYXV0aCI6IlJPTEVfVVNFUiIsImV4cCI6MTY4NDg0MDMzNX0.gpVBL1r1wkXNRq2wOt5Rkw6yBJg9KNPf24R3ZS1qqGwbKGCsLleTSjUulh15heam2eMKPTFG-jxee9KvJXePlA",
"refreshToken": "eyJhbGciOiJIUzUxMiJ9.eyJleHAiOjE2ODU0NDMzMzV9.hlcdr9s63070tB9BLmk9t3_8_UDLiKvqh2n_JjqgQporL6V7Z1Un3tHG8_vceWfPLTOWVebA1-pM30giI0PvnA",
"accessTokenExpiresIn": 1684840335244
}
}
- 실패
- HTTP Status : 400 Bad Request
{
"timestamp": "2023-05-23T10:47:39.557+00:00",
"code": "4001102",
"error": "org.springframework.security.authentication.BadCredentialsException",
"message": "자격 증명에 실패하였습니다."
}
- 성공
- HTTP Status : 201 Created
{
"result": "success",
"data": null
}
- 실패
- HTTP Status : 500 Internal Server Error(500에러가 발생하기는 하지만, 로직에는 문제가 없는 상태)
{
"timestamp": "2023-05-23T11:22:23.862+00:00",
"code": "4001102",
"error": "org.springframework.security.access.AccessDeniedException",
"message": "자격 증명에 실패하였습니다."
}
- 로그인 이후 발급받은 accessToken과 refreshToken을 Body에 넣어 요청, 인증이 되면 재발급이 됩니다.
{
"accessToken": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiYXV0aCI6IlJPTEVfVVNFUiIsImV4cCI6MTY4NDg0MDkyN30.Qud3LNhZoycbmoGQEUzBZlbpo_nnCuV4LtB5OO2wnHPUVjGForiAZ05MFVHjErjsGSFy-iHgXk5YlyOJgCmGbA",
"refreshToken": "eyJhbGciOiJIUzUxMiJ9.eyJleHAiOjE2ODU0NDM5Mjd9.x7zOmplyTZsbSninVlDPcHJ8NYsoW5bES0dG4brSmzj0PcmIhg_fOG4nHFaVgM5EZmv-SSBriy2UOt4lTOItoA"
}
- 성공
- HTTP Status : 201 Created
{
"result": "success",
"data": {
"grantType": "bearer",
"accessToken": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiYXV0aCI6IlJPTEVfVVNFUiIsImV4cCI6MTY4NDg0MTAwNH0.lEHzQUjyJ-qi0dpCk-985dEZuo5ZQDB5DusWBgzRs56kijKKN3LQU3Ly4_BVi-KRAQtlaZgACZQ_MVsNQ0kA8g",
"refreshToken": "eyJhbGciOiJIUzUxMiJ9.eyJleHAiOjE2ODU0NDQwMDR9.GeNYUT0kOklpqiqWtI8DoI9upQ5Kdu6SUjqZWW9dMRtAPPIDnfFYoXF-9xiNNBZjxf09HWEMlb6BbrMBOaWJKA",
"accessTokenExpiresIn": 1684841004370
}
}
- 실패
- HTTP Status : 400 Bad Request
{
"timestamp": "2023-05-23T11:23:23.106+00:00",
"code": "4001102",
"error": "java.lang.RuntimeException",
"message": "자격 증명에 실패하였습니다."
}
- 성공
- HTTP Status : 201 Created
{
"result": "success",
"data": {
"email": "dlgkdis801@jj.ac.kr",
"userName": null,
"nickName": "티이",
"phoneNumber": "010-5678-1234",
"mbti": null
}
}
- 실패
- HTTP Status : 400 Bad Request
{
"timestamp": "2023-05-23T11:25:07.309+00:00",
"code": "4001102",
"error": "org.springframework.security.access.AccessDeniedException",
"message": "자격 증명에 실패하였습니다."
}
{
"nickName": "티이",
"password":"4321",
"phoneNumber": "010-5678-1234"
}
- 성공 : 패스워드 정보는 민감 정보이기 때문에 응답에서 보여주지 않으나, DB에서 변경 여부는 확인 가능합니다.
- HTTP Status : 201 Created
{
"result": "success",
"data": {
"email": "dlgkdis801@jj.ac.kr",
"userName": null,
"nickName": "티이",
"phoneNumber": "010-5678-1234",
"mbti": null
}
}
- 실패
- HTTP Status : 400 Bad Request
{
"timestamp": "2023-05-23T11:28:56.126+00:00",
"code": "4001102",
"error": "org.springframework.security.access.AccessDeniedException",
"message": "자격 증명에 실패하였습니다."
}
- 성공
- HTTP Status : 201 Created
{
"result": "success",
"data": null
}
- 실패
- HTTP Status : 400 Bad Request
{
"timestamp": "2023-05-23T11:30:10.111+00:00",
"code": "4001102",
"error": "org.springframework.security.access.AccessDeniedException",
"message": "자격 증명에 실패하였습니다."
}