주특기 심화 주간 개인 과제
우리 조는 Lv1까지 개인이 구현하고,
Lv2부터 함께 협업하기로 했다.
Lv1의 주제는 Spring Security이다.
🚩 Goal: "Spring Security를 적용한 나만의 항해 블로그 백엔드 서버 만들기"
현재 JWT로 구현되어 있는 회원가입/로그인 기능에 Spring Security를 덧붙이면 된다.
Spring Security 적용 4단계
- 일단 gradle에 Security 관련 의존성 추가
- WebSecurityConfig 생성
- UserDetailsImpl, UserDetailServiceImpl 생성
- 비밀번호 bcrypt로 암호화
CustomSecurityFilter vs jwtAuthFilter
우리의 프로젝트에서는 토큰을 사용해서 인증/인가를 구현했습니다. 따라서 지금 실습환경과는 다르게 Filter에서 ID, PWD가 아니라 토큰을 검증해야 하는데 로그인 요청에는 당연히 토큰이 없죠? 따라서 우리의 프로젝트에서는 로그인 검증은 서비스에서 진행이 되고 로그인 성공 후 반환된 토큰이 인증이 필요한 API 요청과 같이 들어왔을 때 토큰을 검증하여 사용자를 인증 처리해주는 JwtAuthFilter로 적용할 예정입니다.
즉, 정리를 하자면 실습에서는 토큰 방식이 적용되어 있지 않기 때문에 Filter에서 사용자가 요청한 로그인을 검증하고 인증하고 있지만 토큰 방식을 적용하게 되면 사용자의 로그인, 회원가입과 같은 요청은 Filter에서 인증되지 않게 permitAll 처리하여 실제 검증 및 인증 처리는 service에서 수행하고 그 외의 인증이 필요한 요청에서는 로그인을 통해 발급받은 토큰을 같이 보내 Filter에서 토큰을 검증하고 인증처리를 하게 됩니다.
jwtAuthFilter 흐름
- 사용자는 회원가입을 진행한다.
해당 URI 요청은 permitAll 처리하고 사용자의 입력값으로 service에서 회원가입을 진행한다. - 사용자의 정보를 저장할 때 비밀번호를 암호화하여 저장한다.
PasswordEncoder를 사용하여 비밀번호를 암호화한 후 저장한다. - 사용자는 로그인을 진행한다.
해당 URI 요청은 permitAll 처리하고 사용자의 입력값으로 service에서 회원 인증을 진행한다. (비밀번호 일치 여부 등) - 사용자 인증을 성공하면 사용자의 정보를 사용하여 JWT 토큰을 생성하고 Header에 추가하여 반환한다. Client는 이를 쿠키 저장소에 저장한다.
- 사용자는 게시글 작성과 같은 요청을 진행할 때 발급받은 JWT 토큰을 같이 보낸다.
- 서버는 JWT 토큰을 검증하고 토큰의 정보를 사용하여 사용자의 인증을 진행해주는 Spring Security에 등록한 Custom Security Filter를 사용하여 인증/인가를 처리한다.
- Custom Security Filter에서 SecurityContextHolder에 인증을 완료한 사용자의 상세 정보를 저장하는데 이를 통해 Spring Security에 인증이 완료되었다는 것을 알려준다.
👉 즉, 'JWT 토큰과 Custom Security Filter를 통해 사용자를 로그인이 된 상태로 유지시켜준다'라고 이해하면 된다!
오늘의 에러
Spring Security를 모두 적용하고 게시글 작성을 테스트하던 중 위와 같은 에러가 발생하였다.
도저히 어디가 잘못된 건지 알 수가 없어서 기술 매니저님께 도움을 요청했다.
깃헙에 소스코드를 올려 기술 매니저님이 직접 다운받아 함께 에러를 찾아주셨지만
오히려 기술 매니저님은 내 코드가 에러 없이 잘 돌아간다고 하여 혼란이 가중된 상황이었다.
자, 이 말도 안 되는 이야기의 시작은 여기서부터다.
다시 코드를 보던 중, 엄청난 사실을 깨달았다.
내가 새로 만든 Spring Security 관련 파일을 깃헙에 올리지 않은 것..
그러니까 기술 매니저님이 받은 소스 코드는 JWT만 적용된 버전이었던 것이다.
다시 원점으로 돌아가서
인광님이 보내주신 Spring Security 관련 소스코드와 내 소스코드를 Diffchecker로 비교해가며
어느 부분이 잘못된 건지 찾고 있었다.
뭔가 느낌이 쎄했다.
에러가 아니라 내가 이렇게 설정해놓은 느낌이 들었다.
아니나 다를까..
하.. Secured 어노테이션을 붙여놨으니 접근 권한이 없는 게 당연하지...🤦♀️
Secured 어노테이션을 떼고 테스트해보니 아주 잘 동작하는 걸 확인할 수 있었다.
내 자신이 정말 미워지는 순간이었지만, 찾았으니 다행이라고 생각하자.
오늘의 나는
정말 말도 안 되는 에러(가 아닌 멍청한 나^^)로 인해 많은 시간을 날렸다.
그래 다 이렇게 배우는 거지 뭐..
내일은 주말이니 하고 싶었던 공부 잔뜩 하면서
여태까지 작성한 과제의 흐름을 다시 살펴보자!
'📝 TIL' 카테고리의 다른 글
[TIL] 5주차 주특기 심화ㅣ댓글 좋아요 API (0) | 2022.12.13 |
---|---|
[TIL] 5주차 주특기 심화ㅣ게시글 좋아요 API (0) | 2022.12.12 |
[TIL] 4주차 주특기 심화ㅣ주간 시작 (0) | 2022.12.09 |
[TIL] 4주차 주특기 숙련ㅣSpring 시험 (0) | 2022.12.08 |
[TIL] 4주차 주특기 숙련ㅣ권한부여, 예외처리 (0) | 2022.12.07 |