[Spring Security] 개념부터 구현까지

2024. 8. 21. 13:04[Spring_gradle]

spring security를 구현하려고 하는데, 다른 블로그들 코드와 chat gpt를 참고해서 코드먼저 구현하고 이론을 이해하려고 했는데(대략 학교에서 이론을 배웠기 때문에 대략적인 흐름은 알고 있다고 생각했다) 코드 구조도 제대로 파악이 안되고 이론 개념을 잘 모르겠으니 공부하고자 한다.

 

스프링부트 백엔드 개발자되기(저자:신선영)3 책을 통해 공부를 하다가, csrf 공격 세션 고정 공격 등 단어를 보다가 보안이 왜 중요한지 자세히 알고 싶어서 영상을 통해 공부하고자 한다. 

 

1. 스프링 시큐리티의 보안 예시

1) csrf 공격 

- 은행 웹/앱 사이트에서 로그인 하면 나의 세션ID가 할당된다. 이 때, 공격자가 지정한 링크를 클릭하면 내 세션ID정보가 공격자에게 들어가게 된다. 그러면 공격자가 원하는 작업(ex.송금)을 진행할 때, 피해자가 직접 진행한 것처럼 되게 된다. 

2) 세션 고정 공격 

- 공격자가 임의로 생성한 세션ID로 구성된 링크를 통해 로그인을 하면, 공격자가 지정한 고정세션ID로 로그인 한 것이 된다. 그러면 공격자는 로그인 상태의 권한을 얻기 때문에(이 세션 ID는 피해자의 인증 정보와 연결되어 서버 측에서 유효한 세션으로 인정) , 피해자의 개인정보를 보거나 송금 등 작업들을 할 수 있게 된다. 

 

두 공격 모두 ID, PW등 사용자의 인증정보를 직접 알 수 없으나, 권한이 있기 때문에 다른 작업들을 할 수 있다. 

이를 방지하기 위해서 1) 로그인 시 새로운 세션ID 발급 받기 2) 일정시간 활동기록이 없는 세션ID 타임 아웃 3) HTTPS 사용(암호화 된 세션ID 전달) 위와 같은 방법들을 사용하고자 한다. 이와 같은 방법들이 적용된 프레임워크는 스프링 시큐리티 이다. 

 

 

2. 스프링 시큐리티 구현하면서 생긴 에러

스프링 시큐리티 코드 개발 후, 무한 redirect에 빠져서 서버 연결이 안된다. login 페이지가 무한 redirect 요청된 것인데, 이유는 크게 두가지로 본다. 시큐리티 설정 오류인 경우, 뷰컨트롤러와 메서드 명이 일치할 경우가 있다.

나는 전자에 해당했다. 

.formLogin(formLogin -> formLogin.loginPage("/login") .permitAll() // 로그인 페이지는 모든 사용자에게 공개 .defaultSuccessUrl("/",true) // 로그인 성공 후 기본 리디렉션 URL ) .authorizeHttpRequests(authorize -> authorize.requestMatchers("/login","/signup").permitAll() // /login 경로에 대한 접근 허용 .anyRequest().permitAll() //여기서 authenticated()가 아니라 permitAll()로 코드 구현하면 무한 redirect은 안되는데, 그 이유는 현재 로그인 할 수 없다보니 로그인 안한 사용자라서 계속 login 페이지를 리다이렉션 하는 것 )

/login, /signup 경로 제외하고는 authenticated()(=인증된 사용자만 접근 가능), 즉 인증된 사용자만 접근할 수 있도록 설정하는 코드이다. 실제로는 이렇게 코드가 적용되어야 한다. 

하지만 현재는 사용자 인증방법이 구현되어 있지 않기 때문에, 서버에 접근하고자 하는 사용자는 인증되지 않은 사용자로 인식되어(권한 없음) 무한 redirect에 빠졌던 것이다.

 

cf) .requestMatchers (=해당 경로 요청에 대해서는 아래와 같은 설정을 하겠다) <-> .anyRequest(=이외 모든 경로 요청에 대해서는 아래와 같은 설정을 하겠다)

 

그래서 authenticated() 부분을 permitAll()(=누구나 접근 가능) 로 변경했더니, 무한 redirect에 빠지지 않을 수 있었다. 

 

 

3. 스프링 시큐리티 기능 - 폼 기반 로그인

또한 스프링 시큐리티는 폼 기반 로그인 방식을 지원한다.

폼 기반 로그인 방식은 타 로그인 방식에 비해 상대적 장점은 크게 3가지로 나눌 수 있다.

편리한 인증방식(ID, PW입력), 보편성(대부분의 웹/앱에서 지원), 보안성(HTTPS 통해 암호화된 인증정보 전송) 등 있다. 

이와 같은 이유로 자주 쓰이는 인증 방식이다. 

 

비교를 위해 다른 방식의 로그인 방식도 몇가지 설명하고자 한다. 소셜로그인, 생체인증, 토큰기반인증(JWT) 등 있다.  

이후 JWT 에 대해 또 알아볼 것이다.