일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- equals
- 문자열
- 자바
- 데이터 flow
- dfs
- 비트마스크
- pandas
- springboot
- 다익스트라
- series
- Redis
- 포트앤어댑터 아키텍처
- 위상정렬
- 이펙티브 자바
- docker
- 백준
- 세그먼트 트리
- 헥사고날 아키텍처
- disjoint set
- dataframe
- ddd
- UML
- DP
- JPA
- 스프링
- BFS
- java
- 파이썬
- 알고리즘
- spring security
- Today
- Total
코딩못하는사람
Spring Security+JWT (JSON Web Token)를 통한 인증 및 권한처리 본문
JWT Token(JSON Web Token)이란?
JWT란? JSON Web Token (JWT) 두 개체에서 JSON 객체를 사용하여 가볍고 자가수용적인 (self-contained) 방식으로 정보를 안전성 있게 전달해줍니다.
여기서 자가수용적인 방식은 JWT를 사용하는 가장 큰 이유가 됩니다. JWT을 사용하지 않는 이전 인증방식들은 서버에서 접속한 회원의 세션정보를 유지하고 있어야하는 구조였습니다. 그에 따라서 클라이언트가 늘어날수록 서버 자원의 낭비가 심해지는 구조를 가지고있었습니다. 하지만 JWT토큰은 클라이언트에 대하여 무상태(stateless)로 유지하기때문에 훨씬 이상적인 구조입니다.
JWT의 핵심내용을 동작 방식과 함께 살펴보겠습니다.
- 회원 인증
- 정보 교류
- Stateless
동작 방식
Jwt토큰이 사용되는 회원인증과 정보교류를 예시로 들며 동작 방식입니다.
우선 회원 인증 입니다.
JWT 를 사용하는 가장 흔한 시나리오 입니다. 스프링 시큐리티를 통하여 유저가 로그인정보가 DB와 일치한다면, 서버는 유저의 정보에 기반한 토큰을 발급하여 유저에게 전달해줍니다.
그 후, 유저가 서버에 요청을 할 때 마다 JWT를 포함하여 전달합니다. 서버가 클라이언트에게서 요청을 받을때 마다, 해당 토큰이 유효하고 인증됐는지 검증을 하고, 유저가 요청한 작업에 권한이 있는지 확인하여 작업을 처리합니다. (토큰을 받아 localstorage에 담아주었습니다)
여기서 스프링 시큐리티를 활용하여 비로그인,로그인회원들이 접근할수있는 페이지 권한을 모두 다르게 설정해주었습니다.
이러한 동작과정으로 아까 말씀드린것처럼 서버측에서는 유저의 세션을 유지 할 필요가 없습니다. 즉 유저가 로그인되어있는지 안되어있는지 신경 쓸 필요가 없고, 유저가 요청을 했을때 토큰만 확인하면 됩니다.
정보 교류
JWT는 두 개체 사이에서 안정성있게 정보를 교환하기에 좋은 방법입니다. 그 이유는, 토큰마다 권한 정보가 서버 비밀키로 서명이 되어있기 때문에 정보를 보낸이가 바뀌진 않았는지, 또 정보가 도중에 조작되지는 않았는지 검증할 수 있습니다.
실제 프로젝트에 사용해본 예시
1.로그인 이전에는 아무 토큰을 가지고 있지 않습니다.
2.ID,PW로 로그인을 성공하면 헤더에 Authorization에 토큰이 담겨서 날아오게 됩니다.
3.로그인 성공시 토큰이 LocalStorage에 담겨 정상적으로 권한에 맞는 API사용과 세션정보를 얻을 수 있습니다.
4.로그아웃을 하면 당연히 토큰을 날라갑니다.
'스프링부트(SpringBoot) > 활용' 카테고리의 다른 글
Redis를 통한 랭킹보드 구현해보기 (SpringBoot+Redis) (0) | 2021.10.01 |
---|---|
N+1 쿼리 문제 해결로 성능개선하기 (0) | 2021.06.07 |
Gradle 의존성 옵션 정리(Compile VS implementation,옵션) (0) | 2021.06.05 |
[스프링 부트+AWS]2. 스프링 부트에서 테스트 코드 작성 (0) | 2021.05.01 |
[스프링 부트+AWS]1. IntelliJ로 SpringBoot 시작하기 (0) | 2021.04.30 |