Notice
Recent Posts
Recent Comments
Link
관리 메뉴

look-forest

요약 - 로그인 처리 본문

Spring/Spring MVC - 웹 개발 활용 기술

요약 - 로그인 처리

studyHub 2024. 8. 25. 21:39

로그인 처리하기 - 세션 활용

쿠키의 보안 문제 대안 - 세션

  1. 쿠키에 중요한 값을 노출하지 않고, 사용자 별로 예측 불가능한 임의의 토큰(랜덤 값)을 노출하고, 서버에서 토큰과 사용자 id를 매핑해서 인식한다. 그리고 서버에서 토큰을 관리한다.
  2. 해커가 토큰을 털어가도 시간이 지나면 사용할 수 없도록 서버에서 해당 토큰의 만료시간을 짧게(예: 30분) 유지 한다. 또는 해킹이 의심되는 경우 서버에서 해당 토큰을 강제로 제거하면 된다.

서버에 중요한 정보를 보관하고 연결을 유지하는 방법을 세션이라 한다.

  1. 추정 불가능한 세션 ID를 생성하고, 생성된 세션 ID와 세션에 보관할 값을 서버의 세션 저장소에 보관한다.
  2. 세션 ID를 클라이언트에 쿠키로 전달한다.

로그인 처리하기 - 서블릿 HTTP 세션

서블릿을 통해 HttpSession 을 생성하면 쿠키 이름이 JSESSIONID 이고, 값은 추정 불가능한 랜덤 값이다.

 

세션을 생성하려면 request.getSession(true) 를 사용하면 된다. (default : true)

create 옵션이 true면 세션이 없을때 새로운 세션을 생성, false면 생성 않고 null 반환
로그아웃. getSession(false)로 해야 신규 세션이 만들어지지 않는다.

@SessionAttribute

스프링은 세션을 더 편리하게 사용할 수 있도록 @SessionAttribute 을 지원한다.

이미 로그인 된 사용자를 찾을 때는 다음과 같이 사용하면 된다. 참고로 이 기능은 세션을 생성하지 않는다

 

세션 타임아웃 설정

  1. 스프링 부트로 글로벌 설정 (application.properties)
    server.servlet.session.timeout=60 : 60초, 기본은 1800(30분)
  2. 특정 세션 단위로 시간 설정
    session.setMaxInactiveInterval(1800); //1800초

필터, 인터셉터

로그인 여부 체크 로직 등 웹과 관련된 공통 관심사는 서블릿 필터 또는 스프링 인터셉터를 사용하는 것이 좋다.

서블릿 필터

필터는 서블릿이 지원하는 수문장이다. 필터의 특성은 다음과 같다

HTTP 요청 → WAS → 필터1,2,3,, → 서블릿 → 컨트롤러

필터를 적용하면 필터가 호출 된 다음에 서블릿이 호출된다.

 

필터 구현

필터 인터페이스를 구현하고 등록하면 서블릿 컨테이너가 필터를 싱글톤 객체로 생성하고, 관리한다.

 

필터 등록

필터를 등록하는 방법은 여러가지가 있지만, 스프링 부트를 사용한다면 FilterRegistrationBean 을 사용해서 등록하면 된다


스프링 인터셉터

인터셉터는 스프링 MVC 구조에 특화된 필터 기능을 제공한다고 이해하면 된다. 스프링 MVC를 사용하고, 특별히 필터를 꼭 사용해야 하는 상황이 아니라면 인터셉터를 사용하는 것이 더 편리하다.

 

스프링 인터셉터 흐름

HTTP 요청 → WAS → 필터 → 서블릿 → 스프링 인터셉터 1,2,3,, → 컨트롤러

 

스프링 인터셉터 호출 흐름

컨트롤러 호출 전(preHandle), 후(postHandle), 요청 완료 이후(afterCompletion)와 같이 단계적으로 잘 세분화 되어 있다.

preHandle의 응답값이 true이면 정상 호출로 . 다음 인터셉터나 컨트롤러가 호출되고, false이면 더는 진행하지 않는다. false 인 경우 나머지 인터셉터는 물론이고, 핸들러 어댑터도 호출되지 않는다. 그림에서 1번에서 끝이 나버린다.

컨트롤러에서 예외가 발생하면 postHandle은 호출되지 않는다. afterCompletion 은 항상 호출된다. 이 경우 예외를 파라미터로 받아서 어떤 예외가 발생했는지 로그로 출력할 수 있다. 예외와 무관하게 공통 처리를 하려면 afterCompletion() 사용.

 

인터셉터 등록

WebMvcConfigurer 가 제공하는 addInterceptors() 를 사용해서 인터셉터를 등록할 수 있다.

filter와 달리 @Bean으로 등록하는 것이 아니다.


ArgumentResolver 활용

ArgumentResolver(컨트롤러 호출 직전에 호출 되어서 필요한 파라미터 정보를 생성)를 활용해서

로그인 회원을 간편하게 찾아보자.

before
after

1. 애노테이션 생성

 

2. 애노테이션에 로직 적용을 위한 ArgumentResolver  생성

support가 true면 resolveArgument 실행

 

3. ArgumentResolver 등록

 

이렇게 ArgumentResolver 를 활용하면 공통 작업이 필요할 때 컨트롤러를 더욱 편리하게 사용할 수 있다.


참고 자료 & 이미지 출처
스프링 MVC 2편 (김영한 님)


 

 

'Spring > Spring MVC - 웹 개발 활용 기술' 카테고리의 다른 글

파일 업로드  (0) 2025.01.25
스프링 타입 컨버터  (0) 2025.01.24
요약 - 검증과 예외 처리  (0) 2024.08.24
API 예외 처리  (0) 2024.08.11
예외 처리와 오류 페이지  (0) 2024.08.10