개발 낙서장

[TIL] 내일배움캠프 29일차 - JWT 로그인 인증 본문

Java/Sparta

[TIL] 내일배움캠프 29일차 - JWT 로그인 인증

권승준 2024. 2. 2. 21:05

 

 

오늘의 학습 키워드📚

JWT 로그인 인증

기존 강의에서는 인증, 인가 필터를 활용해 로그인 인증을 했었는데 아직 잘 이해가 되지 않아서 따라해봤자 아무 의미 없다는 생각이 들었다.
물론 아예 배제하는 것은 아니고 추후에 당연히 추가적인 공부를 하겠지만 지금 당장 과제를 해야 되는 상황에서 코드를 복붙해 따라 치는 것은 아무런 도움도 되지 않을 것 같아서 필터 없이 JWT 만으로 인증을 진행하고자 했다.

회원가입 부분 API이다. username과 password를 받아 Validation을 진행하고 PasswordEncoder를 통해 비밀번호를 암호화하여 DB에 저장한다.
(Validation은 SpringBoot에서 지원하는 Validation dependencies를 추가해 Dto에 조건을 추가하고 Controller 단에서 BindingResult를 통해 확인했다.)

성공시 유저에 대한 정보를 반환하고 실패시 실패 이유에 관한 메시지와 HttpCode가 반환된다.

로그인을 시도해 성공하면 JWT를 받는 API이다.

username과 password를 Body에 Json 형식으로 요청하며 성공적으로 로그인시 username, 만료 시간, 발급일, 암호화 알고리즘을 통해 JWT를 발급받는다.

기존 Filter를 사용할 때와 다른 점은 Filter를 사용할 때는 Controller 단에서 로그인을 다루지 않는다.
WebSecurityConfig라는 시큐리티 구성 클래스를 통해 사전 설정한 로그인 페이지에서 로그인을 시도하면 JWT 인증, 인가 필터에서 과정을 거쳐 로그인에 성공하고 이후 @AuthenticationPrincipal 어노테이션을 통해 유저 정보를 받을 수 있게 된다.

하지만 나는 JWT를 헤더에 담아 주고 받으며 내부 Secret Key를 통해 검증을 진행한다.
Controller를 통해 주고받냐 아니냐의 차이가 있는데 후자를 사용할 경우 성능상에서 이점이 있지만 확실한 보안 체계를 요구한다면 전자의 방식을 써야 한다고 한다.

테스트 용으로 만든 로그인된 유저 정보를 받는 API이다.

헤더에 JWT를 넣어 보내며 성공하면 username을 반환한다.

@RequestHeader를 통해 "Authorization"의 value값으로 토큰을 검증한다.

근데 처음 API를 작성하고 실행했는데 JWT의 만료 일자가 1월 29일로 돼있어서 계속 만료돼 인증이 안되는 문제가 발생했다.
도대체 왜이러지 하고 쿠키에서도 꺼내보고 헤더에서도 꺼내보고 해봤는데 안되길래 도대체 왜이러지 했는데 아주 바보같은 실수를 했다...

포스트맨에서 Cookies에 등록돼있는 걸 제거하지 않고 계속 바보같은 시도를 하고 있었다.....
다음에 혹시 테스트하고 나면 꼭 확인해줘야겠다.


오늘의 회고💬

인증, 인가하는 부분이 어려워서 좀 오래 헤맸던 것 같다. 그래도 결국 로그인 유저 정보를 가져오는 것에 성공해서 앞으로 구현하는 건 크게 어렵지 않을 것 같다.

 

내일의 계획📜

주말 동안 시간이 나면 계속 API를 구현할 것 같다.

Comments