From e99536f663302931d801e7b1051b76eebeaef4d5 Mon Sep 17 00:00:00 2001 From: banjjoknim Date: Sun, 27 Mar 2022 03:46:53 +0900 Subject: [PATCH] =?UTF-8?q?feat=20:=20HttpServletRequest=20=EC=9D=98=20Hea?= =?UTF-8?q?der=20=EC=A4=91=20Authorization=20=EA=B0=92=EC=9D=84=20?= =?UTF-8?q?=EA=B2=80=EC=82=AC=ED=95=98=EB=8A=94=20AuthorizationFilter=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../playground/config/filter/CustomFilter1.kt | 31 ---------- .../playground/config/filter/CustomFilters.kt | 58 +++++++++++++++++++ .../config/security/JwtSecurityConfiguration.kt | 2 + .../playground/domain/home/HomeApiController.kt | 6 ++ 4 files changed, 66 insertions(+), 31 deletions(-) delete mode 100644 놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/config/filter/CustomFilter1.kt create mode 100644 놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/config/filter/CustomFilters.kt diff --git a/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/config/filter/CustomFilter1.kt b/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/config/filter/CustomFilter1.kt deleted file mode 100644 index 5f1e8d5..0000000 --- a/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/config/filter/CustomFilter1.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.banjjoknim.playground.config.filter - -import javax.servlet.Filter -import javax.servlet.FilterChain -import javax.servlet.ServletRequest -import javax.servlet.ServletResponse - -/** - * @see javax.servlet.Filter - * @see com.banjjoknim.playground.config.security.JwtSecurityConfiguration - */ -class CustomFilter1 : Filter { - override fun doFilter(request: ServletRequest, response: ServletResponse, chain: FilterChain) { - println("필터1") - chain.doFilter(request, response) // 필터체인에 request, response 를 등록해주어야 한다. 그렇지 않으면 현재 필터가 진행되고 이 이후의 필터들은 더이상 동작하지 않게 된다. - } -} - -class CustomFilter2 : Filter { - override fun doFilter(request: ServletRequest, response: ServletResponse, chain: FilterChain) { - println("필터2") - chain.doFilter(request, response) // 필터체인에 request, response 를 등록해주어야 한다. 그렇지 않으면 현재 필터가 진행되고 이 이후의 필터들은 더이상 동작하지 않게 된다. - } -} - -class CustomFilter3 : Filter { - override fun doFilter(request: ServletRequest, response: ServletResponse, chain: FilterChain) { - println("필터3") - chain.doFilter(request, response) // 필터체인에 request, response 를 등록해주어야 한다. 그렇지 않으면 현재 필터가 진행되고 이 이후의 필터들은 더이상 동작하지 않게 된다. - } -} diff --git a/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/config/filter/CustomFilters.kt b/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/config/filter/CustomFilters.kt new file mode 100644 index 0000000..080a65a --- /dev/null +++ b/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/config/filter/CustomFilters.kt @@ -0,0 +1,58 @@ +package com.banjjoknim.playground.config.filter + +import org.springframework.http.HttpMethod +import javax.servlet.Filter +import javax.servlet.FilterChain +import javax.servlet.ServletRequest +import javax.servlet.ServletResponse +import javax.servlet.http.HttpServletRequest +import javax.servlet.http.HttpServletResponse + +/** + * @see javax.servlet.Filter + * @see com.banjjoknim.playground.config.security.JwtSecurityConfiguration + */ +class CustomFilter1 : Filter { + override fun doFilter(request: ServletRequest, response: ServletResponse, chain: FilterChain) { + println("필터1") + chain.doFilter(request, response) // request, response 와 함께 doFilter 를 호출해주어야 한다. 그렇지 않으면 현재 필터가 진행되고나서 이 이후의 필터들은 더이상 동작하지 않게 된다. + } +} + +class CustomFilter2 : Filter { + override fun doFilter(request: ServletRequest, response: ServletResponse, chain: FilterChain) { + println("필터2") + chain.doFilter(request, response) // request, response 와 함께 doFilter 를 호출해주어야 한다. 그렇지 않으면 현재 필터가 진행되고나서 이 이후의 필터들은 더이상 동작하지 않게 된다. + } +} + +class CustomFilter3 : Filter { + override fun doFilter(request: ServletRequest, response: ServletResponse, chain: FilterChain) { + println("필터3") + chain.doFilter(request, response) // request, response 와 함께 doFilter 를 호출해주어야 한다. 그렇지 않으면 현재 필터가 진행되고나서 이 이후의 필터들은 더이상 동작하지 않게 된다. + } +} + +class AuthorizationFilter : Filter { + override fun doFilter(request: ServletRequest, response: ServletResponse, chain: FilterChain) { + val httpServletRequest = request as HttpServletRequest + val httpServletResponse = response as HttpServletResponse + + if (httpServletRequest.method == HttpMethod.POST.name) { + println("POST 요청됨") + val headerAuthorization = httpServletRequest.getHeader("Authorization") + println(headerAuthorization) + + // banjjoknim 이 정상적인 토큰이라고 가정한다. + // 따라서 banjjoknim 이라는 토큰을 id, password 가 정상적으로 입력되었을 때 토큰을 만들어주고 응답에 실어보낸다. + // 클라이언트는 요청할 때마다 해당 토큰을 Header 중 Authorization 의 값으로 포함하여 요청한다. + // 따라서 클라이언트가 요청할 때 Authorization 의 값으로 포함되어 온 토큰이 우리 서버에서 만든 토큰이 맞는지 검증만 하면 된다(RSA, HS256). + if (headerAuthorization == "banjjoknim") { + chain.doFilter(httpServletRequest, httpServletResponse) // request, response 와 함께 doFilter 를 호출해주어야 한다. 그렇지 않으면 현재 필터가 진행되고나서 이 이후의 필터들은 더이상 동작하지 않게 된다. + } else { + val printWriter = httpServletResponse.writer + printWriter.println("인증안됨") // 응답에 '인증안됨' 을 쓴다. + } + } + } +} diff --git a/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/config/security/JwtSecurityConfiguration.kt b/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/config/security/JwtSecurityConfiguration.kt index e2313c0..7e6bcc8 100644 --- a/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/config/security/JwtSecurityConfiguration.kt +++ b/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/config/security/JwtSecurityConfiguration.kt @@ -1,5 +1,6 @@ package com.banjjoknim.playground.config.security +import com.banjjoknim.playground.config.filter.AuthorizationFilter import com.banjjoknim.playground.config.filter.CustomFilter3 import org.springframework.security.config.annotation.web.builders.HttpSecurity import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity @@ -31,6 +32,7 @@ class JwtSecurityConfiguration( // 우리가 원하는 위치에 Filter 를 등록한다. 만약 Spring Security Filter 보다도 먼저 실행되게 하고 싶다면 SecurityContextPersistenceFilter 보다 먼저 실행되도록 아래처럼 등록해주면 된다. http.addFilterBefore(CustomFilter3(), SecurityContextPersistenceFilter::class.java) + http.addFilterBefore(AuthorizationFilter(), SecurityContextPersistenceFilter::class.java) http.csrf().disable() // 기본적으로 웹은 STATELESS 인데, STATEFUL 처럼 쓰기 위해서 세션과 쿠키를 만든다. 이때, 그걸(세션과 쿠키) 사용하지 않도록 설정하는 것이다. diff --git a/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/domain/home/HomeApiController.kt b/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/domain/home/HomeApiController.kt index ff86b32..6a2301d 100644 --- a/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/domain/home/HomeApiController.kt +++ b/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/domain/home/HomeApiController.kt @@ -1,6 +1,7 @@ package com.banjjoknim.playground.domain.home import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RestController /** @@ -18,4 +19,9 @@ class HomeApiController { fun home(): String { return "

home

" } + + @PostMapping("/token") + fun token(): String { + return "

token

" + } }