feat : HttpServletRequest 의 Header 중 Authorization 값을 검사하는 AuthorizationFilter 추가

This commit is contained in:
banjjoknim
2022-03-27 03:46:53 +09:00
parent 7bfd6ed19c
commit e99536f663
4 changed files with 66 additions and 31 deletions

View File

@@ -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 를 등록해주어야 한다. 그렇지 않으면 현재 필터가 진행되고 이 이후의 필터들은 더이상 동작하지 않게 된다.
}
}

View File

@@ -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("인증안됨") // 응답에 '인증안됨' 을 쓴다.
}
}
}
}

View File

@@ -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 처럼 쓰기 위해서 세션과 쿠키를 만든다. 이때, 그걸(세션과 쿠키) 사용하지 않도록 설정하는 것이다.

View File

@@ -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 "<h1>home</h1>"
}
@PostMapping("/token")
fun token(): String {
return "<h1>token</h1>"
}
}