JWT 를 사용하며 2 Factor (sms 인증) 을 하는 방법에 대해서 생각하며 프로젝트를 간단히 만들었습니다.
업무 중, 보안ㅇ 관련하여 2 Factor 인증과 동시접속을 제한해달라는 지시를 받았는데,
이 두 문제를 같이 고려하였습니다.
( 전체 소스 : https://github.com/KyungSik9870/JwtAuthentication )
✹ JWT (Json Web Token) 사용
JWT 란?
JSON 객체를 사용해서 토큰에 정보를 저장하는 Web Token.
Header, Payload, Signature 로 이루어져 있습니다.
헤더에 담겨질때, Authorization : 의 형태를 띄고
type 에 대해서는 JWT 에 특정되는 표준은 없고, OAuth2 에 사용되는 Bearer 를 써도 무방함.
따라서 이번 프로젝트에서는 Bearer 로 지정해서 사용하겠습니다.
💻 요구사항
1. 2 Factor 인증을 넣어 사용가능한 사용자가 맞는지 한번 더 검증이 필요.
방식은 자유이나, 팀원들의 의견이 sms 인증으로 좁혀짐.
(해당 프로젝트에서는 실제 sms 전송은 하지않고 생성만 할 것임)
2. 한 계정의 동시접속을 제한해야 함.
여러대의 PC 에서 접속을 해서는 안된다.
📋 구현기능 목록
순서
- 사용자가 id/pw 로 인증요청을 보낸다.
- AuthenticationFilter 에서 확인한다. (provider 구현하였음)
- 인증이 성공하면 sms 코드를 발급해준다. 이때 DB에 코드 인증여부는 false 로 저장.
- (사용자가 발급받은 sms 코드를 입력하는 화면은 security 에서 permitAll 처리해줌)
- 사용자가 입력한 sms 코드가 DB 값과 일치하면 인증여부를 true 로 업데이트.
- Authorization Filter 에서는 인증여부가 false 면 인가하지 않고, 체이닝을 통과하게 하고,
true 면 인가해줌. - Access Token 이 만료됐다면, Cookie 에서 refresh 토큰을 찾아 유효성을 검사하고,
Access Token 을 재발급해준다.
- JWT 구현
- JWT 를 구현하기 위해 Authentication Filter 커스텀
- JWT 를 구현하기 위해 Authentication Provider 커스텀
- JWT 를 구현하기 위해 Authorization Filter 커스텀
- 인증이 성공했을때, sms 코드를 발급할 것.
- Authorization filter 에서 sms 코드 인증 여부 판단.
- Refresh Token 으로 동시접속 제어.
Refresh Token 을 접속할때 마다 새로 저장하고, Access Token 의 유효기간을 짧게 유지한다.
그러면 Access Token 을 새로 발급받을때, 다른 곳에서 한번 더 접속했다면 Refresh Token 값이 달라져
Access Token 을 발급받지 못할 것임.
Next - step
Redis 를 이용하여 Refresh Token 및 로그인 관리.
'BackEnd > Spring' 카테고리의 다른 글
[Spring] Test - @SpringBootTest (0) | 2022.03.20 |
---|---|
[Spring] Spring Security (4) - Spring Boot 에서의 동작 실습 (0) | 2022.02.27 |
[Spring] Spring Security (3) - Spring Boot의 Filter Chain (0) | 2022.02.27 |
[Spring] Spring Security (2) - Spring Security Filter Chain (0) | 2022.02.23 |
[Spring] Spring Security (1) (0) | 2022.01.10 |