□ 로그인 기능 개선
▷ 문제 상황 : Spring Security에서 지원하는 로그인 인증 기능 일부만 사용 시 예외 상황에 대해 처리 못함
- 모든 에러 메시지 Code가 401 로 통합 처리되고, 이외의 에러 메시지 Code는 500 로 처리됨
▷ 문제 해결
1. 인증 필터 : 로그인 성공 실패에 따른 handler 추가
2. 로그인 성공 핸들러 : 로그인 실패 횟수 초기화, 비밀번호 정책 등
3. 로그인 실패 핸들러 : 로그인 실패 횟수 카운트 처리, 계정 잠금 처리 등
A. 실패 상황에 따른 Status code 구분
Exception | HTTP Status Code | Description |
LockedException | 403 Forbidden | 계정이 잠긴 경우, 사용자가 로그인할 수 없음 |
BadCredentialsException | 401 Unauthorized | 비밀번호가 유효하지 않음. (DB 에 있는 비밀번호와 불일치) |
UsernameNotFoundException | 404 Not Found | 입력한 로그인ID가 DB 에 존재하지 않는 경우 |
AuthenticationCredentialsNotFoundException | 400 Bad Request | 로그인 ID 없이 로그인 요청 |
InternalAuthenticationServiceException | 500 Internal Server Error | 런타임 예외, DB 오류, 내부 서버 등 예기치 못한 오류 발생. |
□ 관리자 권한 추가
▷ AdminFilter 생성
1. 관리자 여부 확인
2. 관리자가 아닐 시, 예외 발생 및 예외 메시지 전달
3. 관리자 여부는 DB 에서 확인
4. 필터 순서 조정 : jwt, Admin 필터 앞 단에 위치
5. 예외 처리 필터
□ web.ignoring() 오류 해결
▷ 문제 발생 : 기존의 필터 우회 설정이 동작하지 않고 있다.
→ 외부 요청은 토큰이 없으므로, JWT 필터에서 예외 처리에 걸린다.
→ 토큰이 없는 요청에 대해 예외 처리를 하지 않는다.
( 인증이 필요한 요청에 토큰 없이 요청할 경우, 로그 로만 남긴다)
▷ 문제 원인 : web.ignoring 설정 적용 안되는 이유
- DelegatingFilterProxy
- 톰캣이 필터 체인을 실행할 때, Security Filter Chain 으로 요청을 위임한다. (연결 역할)
- 스프링 애플리케이션 컨텍스트에서 지정된 이름의 필터(일반적으로 FilterChainProxy )를 찾아
그 필터에게 요청을 넘긴다.
1. web.ignoring() : Security Filter Chain 을 우회하는 설정으로 Security Filter Chain 에만 적용되는 설정이다.
2. 스프링 부트는 기본적으로 @Bean 으로 등록된 필터를 서블릿 필터 체인에 자동으로 등록
▷ 문제 해결
1. 필터 설정 파일 생성 후 Security Filter 설정 파일에 주입
2. 서블릿 필터에 registration.setEnabled(false); 설정을 통해 자동 등록을 비활성화 한다.
▷ 결과
- 기존 filter 설정을 유지하면서, 외부 요청이 필터를 통과하지 않도록 설정할 수 있다.
⭐발표자 : 이현진님
□ 로그인 기능 개선
▷ 문제 상황 : Spring Security에서 지원하는 로그인 인증 기능 일부만 사용 시 예외 상황에 대해 처리 못함
- 모든 에러 메시지 Code가 401 로 통합 처리되고, 이외의 에러 메시지 Code는 500 로 처리됨
▷ 문제 해결
1. 인증 필터 : 로그인 성공 실패에 따른 handler 추가
2. 로그인 성공 핸들러 : 로그인 실패 횟수 초기화, 비밀번호 정책 등
3. 로그인 실패 핸들러 : 로그인 실패 횟수 카운트 처리, 계정 잠금 처리 등
A. 실패 상황에 따른 Status code 구분
Exception
HTTP Status Code
Description
LockedException
403
Forbidden
계정이 잠긴 경우, 사용자가 로그인할 수 없음
BadCredentialsException
401
Unauthorized
비밀번호가 유효하지 않음.
(DB 에 있는 비밀번호와 불일치)
UsernameNotFoundException
404
Not Found
입력한 로그인ID가 DB 에 존재하지 않는 경우
AuthenticationCredentialsNotFoundException
400
Bad Request
로그인 ID 없이 로그인 요청
InternalAuthenticationServiceException
500
Internal Server Error
런타임 예외, DB 오류, 내부 서버 등
예기치 못한 오류 발생.
□ 관리자 권한 추가
▷ AdminFilter 생성
1. 관리자 여부 확인
2. 관리자가 아닐 시, 예외 발생 및 예외 메시지 전달
3. 관리자 여부는 DB 에서 확인
4. 필터 순서 조정 : jwt, Admin 필터 앞 단에 위치
5. 예외 처리 필터
□ web.ignoring() 오류 해결
▷ 문제 발생 : 기존의 필터 우회 설정이 동작하지 않고 있다.
→ 외부 요청은 토큰이 없으므로, JWT 필터에서 예외 처리에 걸린다.
→ 토큰이 없는 요청에 대해 예외 처리를 하지 않는다.
( 인증이 필요한 요청에 토큰 없이 요청할 경우, 로그 로만 남긴다)
▷ 문제 원인 : web.ignoring 설정 적용 안되는 이유
- DelegatingFilterProxy
그 필터에게 요청을 넘긴다.
1. web.ignoring() : Security Filter Chain 을 우회하는 설정으로 Security Filter Chain 에만 적용되는 설정이다.
2. 스프링 부트는 기본적으로 @Bean 으로 등록된 필터를 서블릿 필터 체인에 자동으로 등록
▷ 문제 해결
1. 필터 설정 파일 생성 후 Security Filter 설정 파일에 주입
2. 서블릿 필터에 registration.setEnabled(false); 설정을 통해 자동 등록을 비활성화 한다.
▷ 결과
- 기존 filter 설정을 유지하면서, 외부 요청이 필터를 통과하지 않도록 설정할 수 있다.
⭐발표자 : 이현진님