728x90

본인은 Spring security 3.1.7 을 사용하였고 , 

Security 를 적용하기전에 , 공부하면서 정리해 보았다

 

21/07/28 )

본인은 기본 세션과 쿠키를 이용하여 로그인처리, 로그인 유지를 프로그래밍 하였으나 ,

시큐리티를 적용하여 마이그레이션 해보고자 함

 

내 플젝의 요구사항

  1.  url 에 접근권한 설정
  2. 로그인 권한이 필요한 url로 이동할 시 , 로그인페이지로 이동후 로그온되면 , 다시 첫 url로 이동
  3.  사용자에 의하여 로그인 페이지로 이동후 로그인 시 , 메인페이지로 이동
  4. 로그인 유지기능을 remember me 이용하여서 구현
  5. jsp 파일에서 로그인정보를 가져올 경우엔 , security taglib 이용하여 정보 획득하기
  6. 로그아웃 구현

2.  로그인 권한이 필요한 url로 이동할 시 , 로그인페이지로 이동후 로그온되면 , 다시 첫 url로 이동

(사용자의 요청을 저장하고 꺼내올수 있는)RequestCache 인터페이스를 이용하여

사용자 요청 정보들이 들어 있는 SavedRequest 클래스 객체를 세션에 저장

로그인화면을 보기전에 방문했던 URL을 가져오기

 

5 . jsp 파일에서 로그인정보를 가져올 경우엔 , security taglib 이용하여 정보 획득하기

( pom 에 등록한 spring-security-taglibs 이용하여 jsp 에서 세션 바로 이용)

로그인 성공 -> Authentication에 자동으로 사용자 정보 담김 -> .jsp 파일내 taglib 를 이용하여 세션 정보 도출

 

<sec:authentication property="name" var="Session_userID"/> 을 이용하여 시큐리티 이전에 사용하였던 세션 아이디를 이용함

 

class 에선

Authentication authentication
String Session_userID=(String)authentication.getPrincipal();  을 이용하여 id 획득

 

(주의)

in class)로그인하지 않았다면 , Authentication 객체에 담긴게 없게 되고 , authentication 호출하면 null이나옴
in jsp)<sec:authentication property="name" var="Session_userID"/> -> 등록된게 없으면 ,anonymousUser 가 나옴

 

1. url 에 접근권한 설정

security xml 설정

 

(url리소스)
정회원권한

 

/*/contentView/delete  (Authentication 와 게시글 id 비교)
 /*/contentView/update(get&post) (이하동문)
/*/contentView/updateBoard(이하동문)
/*/contentView/replyBoard(get&post) (Authentication 존재여부)
/*/contentView/deleteComment(Authentication 와 댓글 id 비교)
 /*/contentView/registerComment(Authentication 존재여부)
(요약)=> /*/contentView/**
 /*/write(get&post) 

/*/contentView/asyncGood


비회원권한
 /**

 

문제발생점

 /*/write 페이지에서 ->post 방식에서 세션 만료후 , 글등록을 누르면 -> login 창으로 이동후 로그인 -> 등록은 되는데 이상하게 되는 문제 발생

해결점
  세션만료된 POST 방식의 경우 로그인성공핸들러에서 sendRedirect 를 무시하게함 ( HTTP 메소드를 이용하여 구현 ) 
-> 웰컴페이지로 이동 ( default-target-url="/")

 

특이사항

/*/contentView/asyncGood 는 ajax 요청 url 이다 , 

비로그인 상태에서 해당 링크를 클릭 하면 , 로그인 페이지로 이동할 줄 알았으나 이동하지 않음 

개인적인 생각으로는 ,  서버의 produces 와 클라이언트의 dataType이 이미 JSON 으로 정해져 있으므로 ,

로그인 페이지가 나오지 않은 것으로 보인다..

그럼에도 보안성을 위해서 security xml 에 등록을 하였다

 

3 사용자에 의하여 로그인 페이지로 이동후 로그인 시 , 메인페이지로 이동

security xml 내부에

default-target-url="/" 로 설정하여 구현하였음

 

6 로그아웃 구현

1
2
3
4
5
6
7
8
9
<http>
    ...
    <logout
                logout-url="/logout"
                logout-success-url="/login"
                invalidate-session="true"
                delete-cookies="Cookie_userID"
    />
</http>
cs

로그아웃 성공시 , 로그인페이지로 이동하게 하였고 (5줄)

세션,지정된 쿠키가 해제 되도록 해주었다 (6,7줄)

 

4 로그인 유지기능을 remember me 이용하여서 구현

1. 쿠키만을 이용하는 방법 (Simple Hash Cookie)  - 이용

2. DB에 저장된 데이터를 이용해 쿠키를 이중 인증하는 방법 (Persistent 기반)

1
2
3
4
5
6
7
8
9
10
11
<http>
    ...
    <logout
        ..            
        delete-cookies="SPRING_SECURITY_REMEMBER_ME_COOKIE,Cookie_userID"
    />
    <remember-me
        key="keyforHashde_endcoding"
        token-validity-seconds="604800"
    />
</http>
cs

 

8줄의 key 값은 암호화된 쿠키를 암/복호화 하는데 이용되는 key 값이다

쿠키의 유효시간을 일주일로 잡아주었다(9줄)

로그인html 에서 자동로그인 체크박스의 name="_spring_security_remember_me" 로 잡아주었다

 

특이점

In class) authentication.getPrincipal() 은 사용자의 ID 를 반환해 주었다 , 하지만,

REMEMBER ME 가 적용된 상태에서 -> 자동로그인으로 로그인 -> 서버재실행 -> authentication.getPrincipal() 은 UserinfoVO객체 반환이 되었다

나는 아이디가 필요하였기에 , authentication.getName으로 변경하여 해결 하였지만 ...

개인적인 생각으로는 , 서버가 다운되면 자동으로 Security Context Holder 내부의 Authentication도 초기화가 될 것이고 , 그렇다면 쿠키를 가져와 쿠키내용을 토대로 VO객체 생성후, Authentication 객체 생성에 이용되는 것이 아닐까? 하고 생각해본다.. 두서가 없구나 ㅠㅠ 공부부족이다

 

 

참고 : todyDev :: Spring Security - 로그인 성공 후 부가 작업 (tistory.com) 

spring security 파헤치기 (구조, 인증과정, 설정, 핸들러 및 암호화 예제, @Secured, @AuthenticationPrincipal, taglib) (tistory.com)

스프링 Security_로그인_자동 로그인(Remember-me) [8/9] (tistory.com) 

12. spring security remember me 기능 추가 (tistory.com)

https://djunnni.gitbook.io/springboot/2019-11-30

'21년이전 > 웹_' 카테고리의 다른 글

테스트오류 문제 - No tests found for given includes  (0) 2021.09.07
JUNIT 정리  (0) 2021.09.06
SPRING - Logback 사용하기  (0) 2021.07.29
Spring - 컨트롤러가 두번 호출되는 문제  (0) 2021.07.29
MVN Repository  (0) 2021.07.26

+ Recent posts