본문 바로가기
Spring/Spring Security

[Spring Security] 3. 내가만든 커스텀 로그인화면 사용하기

이제 슬슬 스프링시큐리티에 대하여 자신감이 붙기 시작했으리라 생각한다. 자신감이 생기면 내 마음대로 고쳐보고싶은게 생기기 마련인데 이 포스팅에서는 가장만만한 로그인화면부터 수정하는 방법에 대하여 알아보고자 한다.

 

 

 

 

 

로그인화면 만들기

<!DOCTYPE html>
<html lang="en">
  <body>
    <div class="container">
    <form class="form-signin" method="post" action="/login">
      <h2 class="form-signin-heading">Please sign in</h2>
      <p>
        <label for="username" class="sr-only">Username</label>
        <input type="text" id="username" name="username" class="form-control" placeholder="Username" required autofocus>
      </p>
      <p>
        <label for="password" class="sr-only">Password</label>
        <input type="password" id="password" name="password" class="form-control" placeholder="Password" required>
      </p>
      <input name="_csrf" type="hidden" value="7749bebe-3123-40cc-ac4a-777893ce6186" />
      <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
    </form>
  </body>
</html>

기본으로 제공되어지는 스프링 시큐리티 로그인화면이다. 자세히 살펴보면 전송은 POST방식으로 URL은 /login으로 되어 있다.
그 외에 _csrf라고 적혀있는 토큰이 있는데 토큰에 대해서는 나중에 따로 이야기를 하도록 하고 지금은 그냥 넘어간다.

 

 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<form action="/login" method="post">
    <input type="text" name="id" placeholder="아이디">
    <input type="password" name="pw" placeholder="비밀번호">
    <input name="${_csrf.parameterName}" type="hidden" value="${_csrf.token}"/>
    <button type="submit">로그인</button>
</form>

</body>
</html>

기존 스프링시큐리티의 로그인 화면을 이용하여 직접 만든 로그인페이지 이다.
input태그의 name 값을 변경해도 되냐고 물어본다면 Okay다. 하지만 action부분의 /login은 동일하게 해주어야 한다.
아직 사용자인증 로직을 만든적이 없기 때문에 우선은 스프링시큐리티에서 제공하는 기본 인증로직을 사용해야 하기 때문이다.
추가적인 설명은 xml파일을 설정하면서 따로 기술하도록 하겠다.

 

 

 

 

 

컨트롤러(Controller)

@Controller
public class HomeController {
	
	@RequestMapping(value = "/loginPage")
	public String login() {
		return "loginPage";
	}
	
	@RequestMapping(value = "/admin")
	public String admin() {
		return "admin";
	}
	
	@RequestMapping(value = "/user")
	public String user() {
		return "user";
	}
	
	@RequestMapping(value = "/all")
	public String all() {
		return "all";
	}
}

드디어 자바가 나왔다!! 명심하자 우리는 자바 개발자다..
로그인 화면을 호출하는 컨트롤러를 만들었고 이왕 만드는김에 나중에 권한별로 제대로 권한체크를 하는지 테스트해볼 테스트 페이지와
컨트롤러도 같이 만들어 보았다. 

 

 

 

 

 

security-context.xml

<http auto-config="true" use-expressions="true">
  <intercept-url pattern="/user/**" access="hasAnyRole('ROLE_USER','ROLE_GUEST')"/>
  <intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')"/>
  <intercept-url pattern="/**" access="permitAll"/>

  <form-login
  username-parameter="id"
  password-parameter="pw"
  login-processing-url="/login"
  login-page="/loginPage"
  default-target-url="/all" />
</http>

설정부분의 xml파일인데 form-login부분이 새로 추가되었다. 아마 속성과 속성값을 보면 대략적으로 이해가 될 것이다.
아래에서는 form-login에서 사용되는 속성과 속성값에 대해서 알아보도록 하겠다.

 

 

 

 

 

#form-login 속성

 

username-parameter : input 태그의 name(계정) 속성 값(여기서 말하는 username-parameter의 username은 아이디를 의미한다)

password-parameter : input 태그의 비밀번호 name 속성 값 (default: password)

login-page : 로그인 화면 url

login-processing-url form : 태그의 action 속성 (default : /login)

default-target-url : 로그인 성공시 url

authentication-failure-url : 로그인 실패시 url (default: /login?error=1)

authentication-success-handler-ref : 로그인 성공시 default-target-url이 아닌 핸들러로 리다이렉트

authentication-failure-handler-ref : 로그인 실패시 authentication-failure-url이 아닌 핸들러로 리다이렉트

always-use-default-target : 무조건 핸들러가 지정한 페이지로 이동 (default: false)

댓글