백엔드를 개발하다 보면 특정 유저(관리자, 로그인 한 유저 등)만 사용할 수 있는 api가 있습니다.
로그인 한 유저만 사용할 수 있는 controller를 만들어 보겠습니다. intercepter를 이용해 해당 유저만 통과시키도록 하겠습니다.
intercepter
저희는 intercepter를 만들어서 예외처리를 할 것입니다. 해당 기능을 해 줄 파일 하나를 만듭니다.
그리고 HandlerInterceptor를 상속하고 preHandle를 사용해 controller진입 전에 체크를 해 줄 것입니다.
HttpMethod.OPTIONS.matches(request.getMethod()) : 서버와 통신할 때 예비 요청을 보내 잘 통신되는지 확인한 다음 본 요청을 보냅니다. 이때, 예비 요청은 OPTIONS로 보내집니다. 해당 요청은 통과시킵니다.
handler instanceof ResourceHttpRequestHandler : html, png같은 resource 요청은 통과시킵니다.
이제 해당 클래스를 config로 등록시킵니다. webConfig 클래스를 만들고 WebMvcConfigurer를 상속받습니다.
addCorsMappings는 다른 문제(https://codestudycafe.tistory.com/123)를 해결하기 위한 것이니 넘어갑시다.
로그인 요청 기능은 인증을 하지 않은 사람들이 사용하는 기능입니다. 저는 그런 기능들은 open-api로 시작하게 만들고 open-api로 시작하는 api는 인증에서 제외해 줄 것입니다.
나머지는 전부 검증을 해 줄 것입니다.
중간 테스트
저는 open-api로 login을, api로 work를 만들었습니다. 이것이 무엇을 하는지는 크게 중요하지 않습니다.
/login을 호출했을 때는
log.info("Auth Interceptor url : {}", request.getRequestURI());
이 로그가 찍히지 않습니다.
그리고 /work를 호출하면 제일 위에 auth가 찍히고 있습니다.
인증 기능
저는 세션을 이용해 인증을 진행했습니다. 로그인을 하면 USER에 유저의 정보를 넣어놓습니다.
로그인 시 해당 변수가 비어있거나 값으 잘 있지 않으면 에서, 아니면 통과를 시켜줍니다.
로그인을 하지 않았을 시 아래처럼 에러가 발생합니다.
로그인을 하면 잘 되는 것을 확인할 수 있습니다.
'개발 > 백엔드' 카테고리의 다른 글
spring boot - 비동기 작업 처리 (0) | 2024.11.08 |
---|---|
spring boot - DTO (0) | 2024.10.15 |
spring boot - 1 : N 관계 만들기 (0) | 2024.09.25 |
spring boot - 환경 변수 (2) | 2024.09.22 |
spring boot - 메일 전송 (4) | 2024.09.18 |