프로그램 인증 구현(1)

hee·2023년 8월 29일
0

시큐리티 세팅

pom.xml에 시큐리티 태그라이브러리를 등록하게되면,

	<!-- 시큐리티 태그 라이브러리 -->
	<dependency>
		<groupId>org.springframework.security</groupId>
		<artifactId>spring-security-taglibs</artifactId>
	</dependency>

localhosst:8080/
까지만 입력시 http://localhost:8080/login가 뜨게된다.

어떤 클라이언트가 내 서버에 진입했을 때 인증이 되지 않은 사용자는 가로채서 로그인 화면으로 'Redirection' 하는것이다.
(Redirection은 어떤 주소 요청이 왔을 때 그 주소요청을 변경해서 다른 주소로 보낸 다는 것이다.)

패키지와 Class파일을 만들어준다.

@EnableWebSecurity //해당 파일(SecurityConfig)로 시큐리티를 활성화
@Configuration //Ioc 등록
public class SecurityConfig extends WebSecurityConfigurerAdapter{
	
	@Override
	protected void configure(HttpSecurity http) throws Exception {
//'super삭제' - 시큐리티를 활성화가 된 상태에서 기존 시큐리티가 가지고 있는 기능이 다 비활성화 됨
// 내가 원하는 페이지로 이동하도록 설정
		http.authorizeRequests()
			.antMatchers("/","/user/**","/image/**","/subscribe/**","/comment/**").authenticated() //("")안에있는 단어로 시작하는 단어는.인증이 필요
			.anyRequest().permitAll() //그게 아닌 요청은.모두허용하겠다.
			.and() //그리고
			.formLogin() //접근권한이 없는 페이지를 요청했을 때(=403)
			.loginPage("/auth/signin") //로그인페이지로
			.defaultSuccessUrl("/");  //정상적으로 로그인 되면 이쪽으로 이동
	}
}

시큐리티 설정파일이 되려면,

  1. WebSecurityConfigurerAdapter로 extends해서 상속을 해줘야 한다.
  2. @Configuration 해서 Ioc 등록을 해줘야 한다.
  3. @EnableWebSecurit로 어노테이션 등록해야한다.-해당 파일(SecurityConfig)로 시큐리티를 활성화시켜주는것이다.

configure(HttpSecurity http) 매개변수를 들고있는 함수를 오버라이딩하여 설정을 해준다.

회원가입 구현

정보 넣고 가입버튼 누르면 가입이 가능하게끔 하기

<!--회원가입 인풋-->
<form class="login__input" action="/auth/signup" method="post" >
      <input type="text" name="username" placeholder="유저네임" required="required" />
      <input type="password" name="password" placeholder="패스워드" required="required" />
      <input type="email" name="email" placeholder="이메일" required="required" />
      <input type="text" name="name" placeholder="이름" required="required" />
      <button>가입</button>
</form>

method="post"방식을 했기 때문에 action="/auth/signup"를 해도 다시 가입 화면으로 돌아가는것이 아니다. (데이터베이스에 insert 하기 위해서는 post로 요청)

데이터를 들고 Post 요청을하기 위해서 Controller 만들기

@Controller //1.Ioc등록 2.파일을 리턴하는 컨트롤러 
public class AuthController {
@GetMapping("/auth/signin")
	public String signinForm() {
		return "auth/signin";
	}
	
	@GetMapping("/auth/signup")
	public String signupForm() {
		return "auth/signup";
	}
	
	//signup의 post메서드
	//회원가입버튼->/auth/signup -> 리턴은 /auth/signin 하지만 403으로 이동한다. CSR토큰이 활성화 되어있기 때문이다.
	@PostMapping("/auth/signup")
	public String signup() { 
		System.out.println("signup실행");
		return "auth/signin";
	}
}

@PostMapping("/auth/signup") 페이지를 return "auth/signin";로 리턴하면 원래같은 경우 signin 페이지가 떠야하지만 403으로 이동하게된다.
이유는 CSR토큰이 활성화 되어있기 때문이다.

CSRF토큰

서버에 클라이언트가 요청(회원가입 페이지)을 한다고 가정해보자.
폼에 데이터를 넣고 전송할 것이다.(아이디, 패스워드를 입력하여 서버로 전송)
이때, 전송받은 서버는 시큐리티가 감싸고 있는데 이곳에서는 기본적으로 CSRF토큰 검사를 진행한다.

그래서 클라이언트가 요청(회원가입 페이지)을 하게된다면
서버에서는 응답을 할 때 파일에 토큰(CSRF토큰)을 심음과 동시에, 임시의 난수값(예:KFC)을 넣어서 보내게된다.

다시 클라이언트가 요청하게되면 서버가 보냈던 CSRF토큰을 가지고 있는지 확인을 하고 정상적인 사용자인지 구분한다.

이것을 비활성화 시켜보자.

CSRF토큰 비활성화

	@Override
	protected void configure(HttpSecurity http) throws Exception {
//'super삭제' - 시큐리티를 활성화가 된 상태에서 기존 시큐리티가 가지고 있는 기능이 다 비활성화 됨
// 내가 원하는 페이지로 이동하도록 설정
		http.csrf().disable();//CSRF토큰 비활성화
		http.authorizeRequests()
			.antMatchers("/","/user/**","/image/**","/subscribe/**","/comment/**").authenticated() //("")안에있는 단어로 시작하는 단어는.인증이 필요
			.anyRequest().permitAll() //그게 아닌 요청은.모두허용하겠다.
			.and() //그리고
			.formLogin() //접근권한이 없는 페이지를 요청했을 때(=403)
			.loginPage("/auth/signin") //로그인페이지로
			.defaultSuccessUrl("/");  //정상적으로 로그인 되면 이쪽으로 이동
	}
}

http.csrf().disable(); 이것을 넣어주자

profile
고군분투 코린이의 코딩일기

0개의 댓글

관련 채용 정보