이번 글에서는 SpringSecurity를 이용한 Jwt방식의 인가 처리에 대한 방식과 관련 용어를 정의해보겠다.
용어 설명
우리가 SpringSecurity를 이용해서 client 요청에 대해서 인증을 하고 권한을 부여하기 위해서 이를 위해 노력하는 등장인물들에 대해 먼저 알아봐야한다.
1. Filter
Spring Security는 request에 대해서 Dispatcher servlet이 처리하기 전에 Filter를 통하여 request에 대한 검사를 진행하고 해당 request에 대해서 권한을 부여해준다. 권한을 부여해주는거는 다르게 말하면 request에 대해서 SecurityContext를 부여한다고 이야기할 수 있다.
2. SecurityContext
SecurityContext란 무엇일까?
SecurityContext란 ThreadLocal하게 관리되고 있는 사용자의 Authentication에 대한 정보를 의미한다.
이러한 Authentication에는 다음 3가지를 가지고 있다고 볼 수 있다.
- Principal : UserDetailService의 instance이며 해당 user가 누구이며 인증에 관한 정보를 포함하고 있다.
여기서 userdetailservice가 갑자기 어디서 튀어나오냐고 물어볼 수 있다. 서버는 user의 request가 들어오게 되면 이들이 db상에 저장되어 있는지, 그렇다면 그들에 대한 정보는 무엇인지 등등에 관해서 정보를 가지고 있어야할 것이다. 따라서 SpringSecurity는 UserDetailService라는 인터페이스에 대해서 개발자가 구현을 하여 SecurityContext에 해당 userdetailservice에 대한 instance를 넘기게끔 강제한다.
- Credential : 인증처리를 어떻게 할지에 따라 다르지만 비밀번호, OAuth토큰, Jwt토큰 등 우리가 사용자를 인증하여 부여한 암호값을 저장하는 것이다.
- Authorities : User에게 부여된 권한을 의미한다.
3. SecurityContextHolder
우리가 특정 request에 대해서 SecurityContext를 가지고 부여했다고 하면 이러한 Context를 관리해줄 무엇인가도 있어야한다는게 당연한 생각이다. SecurityContextHolder는 이러한 SecurityContext들에 대해서 관리를 해주는 역할을 한다.
Jwt를 이용한 인증 및 권한 부여 방식
앞썬 부분에서 Spring Security를 이용해서 사용자를 인증하는 것을 설명하기 위한 용어등을 살펴보았다. 이제 이들을 활용해서 전체적인 인증 방식에 대한 처리를 살펴보자.
다음은 SpringSecurity를 활용해서 request에 대한 인증과 권한 부여를 하는 과정을 Sequence Diagram으로 표현한 그림이다.
1. Client가 request를 보내게 되면 이를 우리가 구현하여 설정을 하게 되는 JwtAuthFilter가 request를 받게 된다
2. request Bearer Token부분에 Jwt Token이 있는지 확인한다.
3~6. Jwt Token이 없다면 401 Forbidden을 반환하겠지만 있다면 UserDetailService를 호출하여 사용자의 정보를 검색한다. 이때 JwtAuthFilter가 받게되는 것은 UserDetail Instance로 추후 SecurityContextHolder에게 넘겨주게 된다.
7. Jwt Token의 사용자 정보와 DB상의 사용자 정보가 일치한지 검사한다.
8. 일치하지 않다면 403 Forbidden을 반환하겠지만 일치한다면 SecurityContextHolder에게 userDetail Instance를 넘겨줌으로써 SecurityContext를 생성하게 된다.
9. 이후 기존에 존재하던 FilterChain에 request를 넘겨주게 된다.
이제까지 SpringSecurity를 이용하여 Jwt방식의 사용자 인증 방식에 대한 방법을 알아보았다. 다음 글에서는 이를 구현하는 것에 대한 내용을 정리하겠다.
출처
https://www.youtube.com/watch?v=b9O9NI-RJ3o&t=4721s
https://00hongjun.github.io/spring-security/securitycontextholder/
긴 글 읽어주셔서 감사합니다.
틀린 부분이 있으면 댓글을 달아주시면 감사하겠습니다.
📧 : may3210@g.skku.edu
'개발 > Spring' 카테고리의 다른 글
[Spring ] SLF4J을 이용한 스프링 로그 작성 (0) | 2022.02.15 |
---|---|
[Spring]JUnit에서 Async메소드의 비정상적인 종료 - 2편 (0) | 2022.02.15 |
[Spring]JUnit에서 Async메소드의 비정상적인 종료 - 1편 (0) | 2022.02.10 |
[Spring] Rest Docs 빌드 부터 사용까지 (2) | 2022.01.24 |
[Spring] Spring과 Paging - [1] (0) | 2022.01.20 |