본문 바로가기

Auth (Authentication & Authorization)10

OAuth? 우리는 지금까지 수없이 많은 웹사이트에 가입을 해왔습니다. 모든 사이트의 계정이 동일하면 잊어버릴 일이 없겠지만, 패스워드 규칙도 다르고 중복된 아이디도 존재할 수 있기 때문에 모두 동일하게 할 수 없었을 것입니다. 회원가입을 할 때면, 한 번쯤 생각해봤을 것입니다. “모든 사이트의 계정이 다 통일됐으면 좋겠다..” SSO(Single Sign On)를 도입하면 전혀 불가능한 일은 아닙니다. 그리고 이 SSO를 구성하기 위한 방법 중 하나로 OAuth가 있습니다. 아마 많은 사이트가 OAuth의 인증 방식을 이용하기 때문에 다음과 같은 화면을 한 번쯤은 보셨을 것입니다. 우측 그림은 보호된 자원에 대한 사용 권한을 티몬에게 위임하겠냐는 일종의 "위임장 동의서"입니다. 이 글에서는 인증을 중심으로 OAut.. 2020. 10. 12.
Springboot-Angular-JWT 기반 Auth 구현 - refresh token 추가 이번 포스트에서는 지난 포스트에서 미구현했다고 언급한 refresh token을 추가하여, 인증 구조를 변경하겠습니다. 일반적으로 세션을 사용하는 경우에는 사용자의 액션이 있으면 세션의 만료 시각이 액션이 일어난 시각으로부터 재설정됩니다. 그러나 이전 포스트의 소스코드는 로그인한 시점에 JWT를 생성했고, 그 시점에 token의 만료 시각이 정해집니다. 따라서 로그인 이후, 사용자의 액션이 계속 일어나도 만료 시각이 지나면 로그인이 해제되는 구조가 됩니다. 이러한 구조를 보완하기 위해 refresh token이라는 또 다른 token을 생성합니다. (지금까지 token이라고 명명했던 것을 앞으로는 access token이라고 칭하겠습니다.) refresh token은 access token의 만료 기간보.. 2020. 10. 12.
HttpSession은 "언제" 만들어질까? 이 글에서는 Tomcat이 WAS가 아닌 Servlet Container라는 것을 인지하고, HttpSession이 언제 만들어지고, 어떻게 사용하는지, Session은 어떻게 유지되는 것인지 살펴보도록 하겠습니다. [Tomcat은 WAS? No! Just Servlet Container!] JAVAEE는 엔터프라이즈 애플리케이션을 위해 만든 표준이고, 수많은 클래스/인터페이스로 정의되어 있습니다. JAVAEE 6.0의 스펙에는 Web Services, Web Application, Enterprise Application, Management and Security 기술들이 정의되어 있습니다. 그리고 이 스펙을 모두 구현한 모델을 WAS라고 칭합니다. 우리가 흔히 WAS로 알고 있는 tomcat은 JA.. 2020. 10. 12.
Springboot-Angular-JWT 기반 Auth 구현 - 로그인 흐름 지금까지 Session을 기반으로 A/A 기능을 구현하기 위해 두 가지 방법을 이용했었습니다. 1. SpringBoot + Spring Interceptor + Session 기반의 A/A기능 구현(Interceptor를 이용한 Auth 구현) 2. SpringBoot + Spring Security + Session 기반의 A/A기능 구현(Spring Security를 이용한 Auth 구현) 그리고 지난 포스트(JWT란?)에서 Session 대신 JWT를 이용하여 A/A 기능을 구현할 수 있다고 언급한 바 있습니다. 따라서 이 글에서는 JWT를 이용해 A/A기능을 구현하려 합니다. Session을 이용했을 때와는 달리 Client application(Node.js + Angular)와 Api serv.. 2020. 10. 12.
JWT란? 단순히 Spring Security를 이용하여 A/A를 구성하게 되면 Session에 로그인된 계정을 저장해놓고, 요청이 올 때마다 Session을 조회하여 로그인 여부를 확인합니다. 그러면 사용자가 많은 웹 애플리케이션의 경우에는 Session을 저장하기 위한 저장소와 조회 행위 모두 비용을 증가시킵니다. 이에 대한 대안으로 JWT가 제안되었습니다. JWT는 JSON 객체로 서버-클라이언트 간에 안전하게 정보를 전송하기 위한 방법을 정의한 공개 표준(RFC 7519)입니다. Session에 저장했던 데이터들을 각각의 클라이언트가 JWT형태로 가지고 있자는 취지입니다. 이 포스트에서는 JWT의 형태를 알아보고, SpringBoot에서 JWT 발급 및 복호화를 해보겠습니다. [1] JWT 형태 JWT는 3.. 2020. 10. 12.
Spring-security authorizeRequest 동적으로 설정하기 앞선 글에서의 코드는 몇 가지 문제점이 존재하며 이 글에서는 이 중 한 가지를 어떻게 개선할 수 있는지 살펴보도록 하겠습니다. [1] 문제점 파악 기존 코드의 Spring-security configuration에서 authorizeRequest()를 보면 요청 URL과 그 URL에 접근 가능한 권한을 설정하는 부분이 하드코딩되어있습니다. (6~7라인) @Override protected void configure(HttpSecurity http) throws Exception { http .csrf().disable() .authorizeRequests() .antMatchers("/", "/main").permitAll() .antMatchers("/admin/*").hasAuthority("ADMI.. 2020. 10. 12.
Spring Security를 이용한 Auth 구현 앞서 Spring Security를 사용하지 않고 Interceptor를 이용한 A/A 구현 및 Spring Security의 구조 등을 살펴보았습니다. 이 포스트에서는 이를 기반으로 Spring Security를 이용하여 A/A 기능을 구현해 보도록 하겠습니다. (1) Maven dependency추가 org.springframework.boot spring-boot-starter-security (2) Spring-security config 보안 흐름을 정의하기 위해서 WebSecurityConfigurerAdapter를 확장합니다. 여기에서 다음과 같은 설정들을 할 수 있습니다. 어떤 요청에 대해서 인증을 요구할 것인지 특정 요청에 대해서 어떤 권한을 요구할 것인지 인증되지 않은 요청을 어떤 ur.. 2020. 10. 12.
Spring-Security Authentication Structure Spring-security는 많은 Filter의 chain으로 구성되어 있습니다. 따라서 요청이 들어오면 Authentication/Authorization을 위해 일련의 Filter를 거치게 됩니다. 사용자 인증 요청 시에는 인증 모델을 기반으로 적합한 Filter를 찾을 때까지 Filter chain을 통과합니다. 이 포스트에서는 UsernamePasswordAuthenticationFilter에 도달할 때까지 Filter chain을 통과하도록 코드를 작성할 것입니다. UsernamePasswordAuthenticationFilter를 AuthenticationFilter라고 칭할 것이며 이 Filter의 동작 방식을 그림과 함께 살펴보겠습니다. [request with invalid sessio.. 2020. 10. 12.
Interceptor를 이용한 Auth 구현 interceptor vs spring security 앞서 언급하였듯이, 대부분의 웹 애플리케이션은 Authentication(인증)/Authorization(권한) 기능을 구현하고 있습니다. 이 과정에 필요한 인증된 사용자 정보를 저장하기 위해 Session 혹은 JWT(JSON Web Token) 등을 이용할 수 있는데, 이 포스트에서는 Session에 저장한다고 가정하겠습니다. Spring-security가 정교화되기 전까지는 A/A 기능을 직접 Session에 접근하여 조작했습니다. (Spring-security도 내부적으로는 Session을 이용하지만 out-of-box로 구현되어 있어, 제공되는 정형화된 API를 이용해 A/A를 구현할 수 있습니다. 뿐만 아니라 보안적인 이슈까지도 처리할 수.. 2020. 10. 12.
인증(Authentication)과 인가(Authorization) 대부분의 웹 애플리케이션은 클라이언트의 접근을 통제하기 위해 Authentication(인증)/Authorization(인가) 기능을 구현하고 있습니다. 일반적으로 인증과 인가를 합쳐 Auth라고 구현한다고 말합니다. 인증이란? 클라이언트가 자신이 주장하는 사용자와 같은 사용자인지를 확인하는 과정. 일반적으로 아래와 같은 방법을 통해 인증 기능을 구현합니다. 로그인 폼 HTTP 인증 HTTP 다이제스트 액세스 인증 X.509 인증서 기타 커스텀 인증 방법 인가란? 권한 부여를 의미하며, 클라이언트가 하고자 하는 작업이 해당 클라이언트에게 허가된 작업인지를 확인하는 절차. 즉, 해당 리소스에 접근할 수 있는 권한이 있는지 확인하는 절차. 일반적으로 아래와 같은 방법을 통해 인가 기능을 구현합니다. URL에.. 2020. 8. 19.