티스토리 뷰



[스프링 시큐리티 3장 정리]
스프링 시큐리티는 기본 Security 네임스페이스 설정을 사용하더라도 기본적인 로그인, 인증, 권한부여의 기능 구현이 가능함.

1. 로그인 / 로그아웃 이해
 - 헤더/푸터 페이지 구성(태그 라이브러리를 활용)
 - 폼 액션의 경우, UsernamePasswordAuthentification 서블릿 필터에서 설정한 액션과 일치해야 함. 
   폼의 기본 액션 값은 j_spring_security
 - <intercept-url>태그 설정을 통하여 로그인 페이지로 접근할 수 있는 URL 및 액세스 권한을 설정해야 함
   ▶︎ 스프링 시큐리티의 모든 URL 요청에 대해 위에서 아래로 내려오는(top to bottom) 순서대로 권한부여 규칙을 해석해 적용
   ▶︎ ex) 
   <intercept-url pattern="/login.do" access="permitAll">
   <intercept-url pattern="/*" access="hasRole("ROLE_USER")"

 - 로그아웃은 일반적으로 사이트에서 보호되지 않은 영역으로의 이동/리다이렉트를 뜻함.
   ▶︎ 모든 URL 요청은 서블릿 요청으로 리졸브되기 전에, 항상 필터 체인을 통과함.(중요)
   ▶︎ ex)
   <logout invalidate-session="true"
logout-sucess-url="/"
logout-url="/j_spring_security_logout" />
   : /j_spring_security_logout의 경우, 컨트롤러 및 서블릿에 맴핑된 실제 주소가 아닌, 가상의 url
     logout-success-url 속성의 경우, 로그아웃이 정상적으로 수행된 후 리다이렉트 될 주소에 대한 설정
   ▶︎ 로그아웃은 크게 3단계로 이뤄짐 -> 세션 무효화 / SecurityContext초기화 / logout-sucess-url에 지정된 url redirect
   ▶︎ LogoutHandler 구현이 직접 가능하며, 세션 초기화 및 사용자 인증 관련 정보가 남지 않도록 할 수 있다.
 - 

2. Remember Me 기능 구현
 - 쿠키를 암호화하고, 사용자 브라우저에 저장해 재방문하는 사용자를 기억하는 기능
  : rememberMe 쿠키 값을 가지고 있으면, 별도의 인증 절차를 거치지 않고 로그인 및 인증 처리
 - 기본 설정
   <remember-me key='jbcpPetStore'>
   ▶︎ key : 쿠기에 대한 고유값 / token-validity-seconds : 시간 범위를 설정, 설정 시간에만 유효(초단위)
 - 동작 원리
   ▶︎ 사용자명 / 쿠기 만료 일자 / 만료 일자, 사용자명, 비밀번호에 대한 MD5 해시값 / remember-me태그 기본 key 값
      : 기본적으로 base64 인코딩 처리 => 임의 길이를 갖는 압축된 텍스트로 반환(다이제스트)
   ▶︎ 입력이 된 값의 인코딩된 값과 저장되어 있는 인코딩값과 비교 검증을 통하여 일치 유무 판단
      : 쿠키 값을 디코딩 후 검증

 - 완전히 인증된 세션과 rememberMe를 이용한 세션의 구분이 분명하게 필요
   ▶︎ rememberMe 세션에 대해서는 완전한 인증(fullyAuthenticated)을 받도록 해야 함.
      : <intercept-url> 설정 및 내부의 SpEL 표현식의 조합을 통하여 설정 가능

 - IP주소를 인식하는 rememberMe 서비스 개발
   ▶︎ 클라이언트의 IP 주소를 기반으로 하여, MD5 해시값을 생성하여 http 통신 중에 발생할 수 있는 악의적인 접근에 대해서 
      차단이 가능함.   
   ▶︎ TokenBasedRememberMeServices 부모 클래스를 상속, onLoginSuccess, makeTokenSignature, setCookie 및
      processAutoLoginCookie 매서드를 오버라이드하여 IP주소를 받아오고 이를 적절하게 변환처리하여 rememberMe 쿠키값에
      저장할 수 있도록 오버라이드 메소드 로직을 구성.
   ▶︎ 위에서 작성된 rememeberMe 서비스에 대해서는 빈을 등록하여 (위에서 작성한 클래스에 설정자 초기화를 통하여) 이를
      <remember-me> 설정에서 참조할 수 있도록 service-ref 속성값을 지정.
   ▶︎ 추가적으로 <remember-me> 속성값 설정을 통하여 폼에서 넘어오는 remember_me 값에 대해서 사용자가 지정이 가능
 
3. 비밀번호 찾기 및 사용자 관리 기능 개선,추가
 - UserDetailService 인터페이스 구현체를 상속하여 기본 기능 제공
  (인메모리 기반으로 디비 및 저장방식에 얽매이지 않고 프레임워크에서 제공하는 확장 기능의 흐름과 설계에만 집중)
  (하드코딩된 사용자 목록을 사용하여 단위 테스트를 작성할떄 주로 사용)
 - InMemoryDaoImpl 인메모리 크리덴셜 저장소를 사용하여 UserDetails를 저장
   ▶︎ InMemoryChangePasswordDaoImpl을 사용하여 InMemoryDaoImpl 상속 및 시큐리티 설정



공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함