-
[Spring] Spring Security + JWT 로그인 구현하기 - 3Spring 2023. 6. 15. 17:49
📝 지난 포스팅
➡︎ Spring Security + JWT 로그인 구현하기 - 2
지난 번에 Spring Security + JWT로 구현한 로그인 기능을 구현해보았는데
이번에는 Postman을 사용해서 로그인 기능이 잘 작동하는지 테스트를 할 것이다!
1️⃣ DB에 member 저장
다음 SQL문을 실행하여 DB에 test용 회원을 저장해주었다.
insert into member (member_id, address, nickname, password, phone, username) values (1, '서울시 광진구', '수띠', '0000', '010-1234-5678', 'suddiyo'); insert into member_roles (member_member_id, roles) values (1, 'USER');
두 테이블에 정상적으로 데이터가 저장되었다.
2️⃣ SignInDto 구현
controller에서 요청을 보내기 위해 사용할 SignInDto를 작성한다.
SignInDto.java
@Getter @Setter @ToString @NoArgsConstructor public class SignInDto { private String username; private String password; }
3️⃣ MemberController 구현
이전에 SecurityConfig에서 정의한 보안 설정은 다음과 같다.
"members/sign-in" ➡︎ 모든 사용자에게 허용
"members/test" ➡︎ USER 권한을 가진 사용자에게 허용
이제 테스트를 위하여 다음 과정을 거칠 것이다.
- Postman으로 이전에 DB에 저장했던 회원 정보(username, password)를 body에 담아서 "members/sign-in"으로 요청
- 성공적으로 Access Token 발급
- 발급받은 Access Token을 header에 넣어 "members/test"로 요청
MemberController.java
@Slf4j @RestController @RequiredArgsConstructor @RequestMapping("/members") public class MemberController { private final MemberService memberService; @PostMapping("/sign-in") public JwtToken signIn(@RequestBody SignInDto signInDto) { String username = signInDto.getUsername(); String password = signInDto.getPassword(); JwtToken jwtToken = memberService.signIn(username, password); log.info("request username = {}, password = {}", username, password); log.info("jwtToken accessToken = {}, refreshToken = {}", jwtToken.getAccessToken(), jwtToken.getRefreshToken()); return jwtToken; } @PostMapping("/test") public String test() { return "success"; } }
4️⃣ Postman으로 "members/sign-in"에 요청
아까 DB에 저장했던 username과 password를 JSON 형식으로 Request Body에 넣어서 요청을 보내주었다.
성공적으로 JwtToken 값들이 출력되는 것을 볼 수 있다.
* 이 때 주의해야 할 점은, SignInDto 클래스에서 사용한 자료형과 body에 넣어 보내는 자료형을 일치시켜야 한다.
ex) JSON 객체를 넣어 보낼 때 password는 0000이 아닌 "0000"으로 담아서 요청을 보내야 한다.
5️⃣ 발급받은 Access Token으로 test API 호출
Postman으로 올바른 요청을 보내서 로그인에 성공하였다.
"members/test"로 요청을 허용받기 위해서는 roles에 USER가 포함되어 있어야 한다.
DB에 저장 할 때 회원의 roles에 USER를 넣어줬기 때문에,
반환받은 Access Token을 Header에 담은 채로 요청을 보낸다면 response로 "success"를 받을 수 있을 것이다.
이와 같이 Header의 Key에는 Authorization, Value에는 Bearer [발급받은 Access Token] 을 넣어 요청을 보내면 success를 받을 수 있다.
토큰 값을 변경하면 해당 API 요청 실패가 뜬다.
🔎 SecurityUtil
추가로 어떤 회원이 API를 요청했는지 쉽게 조회할 수 있는 클래스이다.
static method인 getCurrentUsername()을 호출하여 현재 요청을 보낸 회원의 username을 간단하게 얻을 수 있다.
테스트를 위해 MemberController의 test의 return값으로 SecurityUtil.getCurrentUsername()을 호출해주었다.
MemberController.java
@PostMapping("/test") public String test() { return SecurityUtil.getCurrentUsername(); }
SecurityUtil.java
public class SecurityUtil { public static String getCurrentUsername() { final Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (authentication == null || authentication.getName() == null) { throw new RuntimeException("No authentication information."); } return authentication.getName(); } }
응답값으로 username이 반환된 것을 확인할 수 있다.
📝 이어지는 포스팅
➡︎ Spring Security + JWT 로그인 구현하기 - 4
📋 참고 자료
728x90'Spring' 카테고리의 다른 글
[Spring] TDD와 단위 테스트 (0) 2023.06.18 [Spring] Spring Security + JWT 로그인 구현하기 - 4 (6) 2023.06.16 [Spring] Spring Security + JWT 로그인 구현하기 - 2 (17) 2023.06.15 [Spring] Spring Security + JWT 로그인 구현하기 - 1 (4) 2023.06.14 [Spring] JWT(Json Web Token)란? | 구조, 암호화 방법, 장단점 (0) 2023.06.14