내일배움캠프 28일차 - Spring 인증과 인가에 대하여
Spring 프레임워크를 통한 인증, 인가
나도 할 수 있을 때까지.....
인증과 인가
1. CRUD를 구현을 하면서 우리는 보안을 중요시한다.
2. 보안을 위해 우리는 인증과 인가를 달아볼 것이다.
3. 인증이란 어떤 개체(사용자 또는 장치)의 신원을 확인하는 과정입니다. 개체는 보통 어떤 인증요소를 증거로 제시하여 자신을 인증합니다.
4. 예를 들어 은행에 가서 돈을 인출하려면 하면 은행직원은 여러분이 누구인지 확인하기 위해 신분증을 제시해 달라고 요청할 수 있습니다. 비행기 티켓을 구매하려고 하면 여러분이 비행기를 탈 수 있는 자격이 되는지 증명하기 위해 여권을 제시해야 할 수도 있습니다. 두 예 모두 신원(인증된 사용자)을 확인하기 위해 인증 절차가 어떻게 진행되는지를 보여줍니다.
5. 온라인에서도 마찬가지입니다. 예를 들어 여러분이 페이스북 프로필이나 회사 메일 클라이언트 프로그램에 접속하려고 할 때 비슷한 일이 일어납니다. 신분증이나 여권을 제시하는 대신 아이디/패스워드를 입력하거나 휴대폰에 전달된 SMS에 적혀있는 코드를 입력하는 것이지요. 인증요소는 하나일 수도 있고 두 개(two-factor) 또는 그 이상(multi-factor) 일 수도 있습니다.
6. 인가는 어떤 개체가 어떤 리소스에 접근할 수 있는지 또는 어떤 동작을 수행할 수 있는지를 검증하는 것, 즉 접근 권한을 얻는 일을 말합니다.
7. 예를 들어 공연장에 입장하기 위해 티켓을 구매하는 상황을 생각해 보세요. 이 경우 공연 기획사에서는 여러분의 신원이 무엇인지에 대해서는 관심이 없습니다. 여러분이 공연장에 입장할 권한이 있는지 여부에만 관심이 있죠. 입장 권한을 증명하려면 신분증이나 여권 대신 티켓만 있으면 됩니다. 티켓 여러분의 신원 정보를 포함하고 있지 않더라도 인가 과정에서 검증이 실패하는 것이 아니지요.
8. 인터넷 기반 앱에서는 일반적으로 토큰이라 부르는 가공물을 사용하여 인가를 다룹니다. 유저가 로그인을 하면 앱은 유저가 무엇을 할 수 있는가에 관심을 갖게 됩니다. 위 예에서는 사용자 신원을 바탕으로 인가 세부사항을 가진 토큰을 생성하게 됩니다. 시스템은 인가 토큰을 이용해서 어떤 권한을 부여할지, 즉 리소스 접근 요청을 허용할지 거부할지를 결정합니다.
9. 그러하여 Spring Boot security를 사용하는 이유는 Spring의 생태계에서 보안에 필요한 기능들을 제공하기 때문에, 개발자 입장에서 일일이 보안 관련 로직을 작성하지 않아도 된다는 장점이 있습니다.
10. Spring Security는 Spring이라는 프레임워크에서 활용하기 적절한 구조로, 보안 기능을 추가할 때 활용하기 좋습니다. 프레임워크를 사용하지 않고 코드를 직접 작성할 경우 Spring에서 추구하는 IoC/DI 패턴과 같은 확장 패턴을 고려하여 인증/인가 부분을 직접 개발하기 쉽지 않지만, Spring Security에서는 이와 같은 기능들을 제공해 주기 때문에 개발 작업 효율을 높일 수 있습니다. 그러나, Spring Security를 사용하지 않는다면 직접 Session을 체크하고 redirect 등을 해야만 합니다.
11. Spring Security로 스프링 애플리케이션의 보안설정을 담당하는 스프링의 하위 프레임워크로, 인증과 인가등의 과정을 Filter Chain에서 처리한다. 즉, 요청이 Dispacher Servlet에 도달하기 이전에 요청에 대한 인증/인가처리를 수행하기 때문에 Dispacher Servlet에는 인증/인가된 요청만 도달할 수 있도록 한다.
12. 스프링 시큐리티는 기본적으로 쿠키-세션방식의 인증을 수행한다. 사용자가 로그인 요청을 보내면 시큐리티 필터체인을 거쳐 사용자 인증을 수행하고, 인증에 성공하면 사용자의 정보를 세션에 담아 저장한 뒤 JSESSIONID에 세션 id를 담아 사용자에게 반환한다. 이후 사용자는 이 세션id를 통해 서비스에 접근할 수 있다. 만약 쿠키-세션방식이 아닌 토큰방식을 사용하고 싶으면 config 클래스 아래 문장을 추가하면 된다.
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) // 쿠키 - 세션 사용x
...
}
}
스프링 시큐리티의 필터체인은 크게 인증필터와 인가필터로 나누어진다. 이때, 인증필터는 인가필터보다 앞쪽에 위치하기 때문에 인증에 성공한 요청만이 인가 프로세스로 진입할 수 있다. 이 과정에서 스프링 시큐리티는 Principal(접근주체)을 아이디로, Credential을 비밀번호로 하는 Credential 기반 인증을 사용한다.
https://dextto.tistory.com/234
인증(Authentication) vs. 인가(Authorization)
인증(Authentication)과 인가(Authorization)는 항상 함께 등장하는 개념이면서 사용하기에 헷갈리는 용어이기도 합니다. 문맥상 어색하지 않은 경우가 있어 이 둘의 차이를 두지 않고 사용하는 경우도
dextto.tistory.com
https://gyunny.tistory.com/275
[Spring Boot] Spring Security란? 인증,인가,보안 담당
Spring Security란?Spring Security는 Spring 기반 애플리케이션의 인증, 인가 및 보안을 담당하는 스프링 하위 프레임워크입니다.Spring Security는 인증(Authentication)과 권한(Authorization)에 대한 부분을 Filter 기
gyunny.tistory.com
[Spring Security] 스프링 시큐리티 - 인증 프로세스
Spring Security - Authentication
velog.io
<출처>
오늘의 느낀 점
1. 찬바람이 분다
2. 머릿속이 차다.
3. 돌처럼 얼어버렸다.