새소식

반응형
250x250
🔲 Framework/🔒 Spring Security

[Spring Security]로그인 커스터마이징(왕초보)(2) - 로그인, 로그아웃 기능 구현

  • -
728x90
반응형

전자정부 표준프레임워크(v3.10.0)로 진행했고, 시큐리티 관련 설정은 이 글 참고

https://hyewonkim1996.tistory.com/19

 

[eGov]전자정부 프레임워크(v3.10.0)와 Spring Security(스프링 시큐리티) 연동

전자정부 스프링 시큐리티 연동 1.pom.xml에서 스프링 시큐리티 라이브러리 설정(호환되는 버전인지 확인 필수) 이 글에서는 v3.10.0 기준 호환되는 스프링 시큐리티 버전 4.2.13.릴리즈로 설정했다.

hyewonkim1996.tistory.com

 

시큐리티로 로그인 구현 실습하기에 앞서, 시큐리티는 구조와 흐름을 꼭 알아야 하니 모른다면 이 글을 참고하고 오자.

https://hyewonkim1996.tistory.com/23

 

[Spring Security]스프링 시큐리티란? 스프링 시큐리티 개념, 구조, 흐름

✅ 스프링 시큐리티란? 스프링 기반 애플리케이션의 인증과 인가를 담당하는 스프링 하위 프레임워크 🔹 인증 : 로그인, 회원가입 🔹 인가 : 인증된 사용자의 권한에 따라 접근 허락 ✅ 스프링

hyewonkim1996.tistory.com

 

*이전 글에서 완료한 부분*

1.회원가입 시 사용자가 입력한 비밀번호를 시큐리티 인코더로 암호화해 저장

https://hyewonkim1996.tistory.com/21

 

[Spring Security]로그인 커스터마이징(왕초보)(1) - context-security 뜯어보기, 비밀번호 암호화(BCrypt)

전자정부 표준프레임워크(v3.10.0)로 진행했고, 시큐리티 관련 설정은 이 글 참고 https://hyewonkim1996.tistory.com/19 [eGov]전자정부 프레임워크(v3.10.0)와 Spring Security(스프링 시큐리티) 연동 전자정부 스프

hyewonkim1996.tistory.com


 

이번 포스팅에서는 남은 부분을 이어서 해 보겠다.

 

2.시큐리티 설정 파일에서 설정한 로그인 페이지에서 사용자가 로그인 시도

1)로그인 form 만들기

<form id="loginForm" action="login" method="post">
	<h2>로그인</h2>
	<button id="login" class="submit">로그인</button>
	<input type="text" class="user" name="m_id" placeholder="아이디" />
    <input type="password" class="pass" name="m_pw" placeholder="비밀번호" />
</form>

참고로 form의 name은 DB 컬럼명과 같아야 한다.

2)context-security.xml에서 form-login 설정

username-parameter/password-parameter를 DB 컬럼명에 맞게 설정

(form name, VO의 필드, username/password parameter를 모두 DB 컬럼명과 일치시켜야 한다)

login-processing-url을 /login으로 설정

login-page를 로그인 폼이 있는 jsp 파일과 연결된 컨트롤러 value로 설정

default-target-url 로그인 성공 시 매핑할 컨트롤러 value

authentication-failure-url 로그인 실패 시 매핑할 컨트롤러 value

 

3.사용자가 로그인 폼에 입력한 아이디와 비밀번호(역시 인코더로 암호화)를 가지고 스프링 시큐리티에서 자체 검증

1)context-security.xml에서 authentication-provider 설정 및 인코더 bean 생성

<!--비밀번호 검증할 암호화 인코더 bean 생성-->
<beans:bean id="bcryptPasswordEncoder"
		class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />
<authentication-provider>
			<jdbc-user-service data-source-ref="dataSource"
				users-by-username-query="SELECT m_id AS m_id, m_pw AS m_pw, enabled FROM member WHERE m_id = ?"
				authorities-by-username-query="SELECT m_id AS m_id, levels AS levels FROM member WHERE m_id = ?" />
			<!-- 스프링 시큐리티에서 검증시 사용할 비밀번호 암호화 인코더
            스프링 시큐리티에서는 디비, 클라이언트 입력 비밀번호 모두 암호화를 꼭 거쳐야 검증이 가능함! -->
			<password-encoder ref="bcryptPasswordEncoder" />
</authentication-provider>

이때 검증에 사용할 인코더와 회원가입 시 사용한 인코더가 반드시 일치해야 오류가 나지 않는다.

예를 들어 가입 시에는 BCrypt로 암호화된 비밀번호인데, 로그인 검증 인코더는 BCrypt가 아니라면 오류가 난다.

 

4.로그인 실패, 성공 여부에 따른 로직 실행

1)컨트롤러에 login-page, default-target-url, authentication-failure-url 매핑

 

login-page

@RequestMapping(value = "/home", method = RequestMethod.GET)
	public String home() throws Exception {
		return "sample/home";
	}

 

default-target-url

@RequestMapping(value = "/login_success", method = RequestMethod.GET)
	public String login() {
    return "redirect:/home";
	}

authentication-failure-url

@RequestMapping(value="/login_fail", method=RequestMethod.GET)
	public String login_fail() throws Exception{
		return null;		
	}

 

*결과 확인 - 로그인 실패*

 

*결과 확인 - 로그인 성공*

 

스프링 시큐리티를 사용하지 않았다면 로그인 시 컨트롤러에서 DB 조회 쿼리를 실행해 직접 비교해야 했겠지만,

스프링 시큐리티를 사용하면 컨트롤러에 로그인 로직을 구현할 필요 없이 이렇게 자체적으로 로그인 처리가 된다!

 

+로그아웃

1)context-security.xml에서 로그아웃 설정 추가

<logout logout-url="/logout" logout-success-url="/logout_After" />

logout-url을 /logout으로 설정(스프링 시큐리티 자체 로그아웃 url)

logout-success-url을 로그아웃 후 매핑할 컨트롤러 value로 설정

 

2)컨트롤러에서 로그아웃 후처리

@RequestMapping(value = "/logout_After", method = RequestMethod.GET)
	public String logout() throws IOException {
		return "redirect:/home";
	}

 

728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.