본인은 Spring security 3.1.7 을 사용하였고 ,
Security 를 적용하기전에 , 공부하면서 정리해 보았다
21/07/28 )

본인은 기본 세션과 쿠키를 이용하여 로그인처리, 로그인 유지를 프로그래밍 하였으나 ,
시큐리티를 적용하여 마이그레이션 해보고자 함
내 플젝의 요구사항
- url 에 접근권한 설정
- 로그인 권한이 필요한 url로 이동할 시 , 로그인페이지로 이동후 로그온되면 , 다시 첫 url로 이동
- 사용자에 의하여 로그인 페이지로 이동후 로그인 시 , 메인페이지로 이동
- 로그인 유지기능을 remember me 이용하여서 구현
- jsp 파일에서 로그인정보를 가져올 경우엔 , security taglib 이용하여 정보 획득하기
- 로그아웃 구현
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)
스프링 Security_로그인_자동 로그인(Remember-me) [8/9] (tistory.com)
'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 |