오늘은 스프링 시큐리티를 이용한 JWT로그인을 포스팅하려고 합니다.
스프링 공부를하면서 Spring Security 기능을 알게 되었는데 이기능을 자주 쓰기도 하고 보안에 취약하지 않은 것 같고 권한에 대해서도 인증절차가 잘 되어있어 현재 많이 사용되고있는 기능같습니다.
[Spring Security]
1. Authentication(인증) : 사용자 인증 절차
2. Authorization(권한) : 사용자 권한/등급
이 두가지를 도와주는 것이 Spring Security인데요 인증 과정에 대해서 한번 살펴보겠습니다.
이 이미지는 다른 사이트에서도 많이 보셨을텐데요 저희가 Spring Security를 이해하는데 도움이 되는 자료입니다.
번호 순서대로 설명드리겠습니다.
1. Request요청이 들어온 뒤 AuthenticationFilter를 거치게 됩니다.
2. UsernamePasswordAuthenticationToken이라는 필터를 만나게 되는데요 이 필터는
스프링 시큐리티에서 제공해주는 로그인 폼인데요 여기서 사용자를 인증후 UsernamePasswordAuthenticationToken을 생성합니다.
3. 그럼 그 토큰을 AuthenticationManager가 받게 됩니다.
4. AuthenticationManager는 그 토큰을 또 AuthenticationProvider에게 토큰을 넘겨주게 됩니다.
5. AuthenticationProvider는 토큰을 UserDetailsService에서 해당 Id와 PW가 DB에 존재하는지 확인합니다.
6. 확인을 한 뒤 UserDetails 타입의 객체로 데이터를 반환 해줍니다.
본 예제에서는 User는 사용자(개발자)가 정의한 User이며 class User implements UserDetails 이런 식으로 UserDetails 를 implements하여 구현해줍니다.
7. 그리고 나서 AuthenticationProvider에서 6번에서 받은 UserDetails를 이용하여 Authentication객체를 반환합니다.
8. 9. 다시 Filter를 통하여 Authentication객체를 SecurtiyContextHolder에 담은 후 AuthenticationSuccessHandle을 실행합니다.
여기까지가 Spring Security의 정상흐름입니다.
[JWT]
Json Web Token 의 약어로 JWT라고 부릅니다. 이는 저희가 자주쓰이는 데이터의 형태인데요.
JSON을 쓰기 이전에는 CSV방식을 주로 사용했습니다.
','를 기준으로 데이터를 구분 짓는 형태인데요.
Darren,김대현,대학생
이런 방식이 CSV형식이고
{
"닉네임" : "Darren",
"이름" : "김대현",
"직업" : "대학생"
}
위와 같은 형태를 JSON형식입니다. 이는 Key/Value로 구분되어있어 정보를 검색할때 매우 용이합니다.
JWT의 경우는 전자 서명된 URL-safe의 JSON입니다. 전자 서명은 JSON의 변조를 체크할수 있는데요. JWT는 Claim이라는 속성정보를 JSON데이터로 표현한 토큰으로 RFC7519표준입니다.
JWT의 경우 서버와 클라이언트간 정보를 주고 받을 시 Header에 JSON토큰을 넣은 후 서버는 인증과정없이 Header에 포함되어있는 JWT정보를 통해 인증하게 됩니다.
우리가 JWT를 사용안하게 되면 Cookie & Session을 사용했는데요 이 Cookie와 Session은 서버자원을 많이 사용하게 되는 단점을 가지고있습니다. 반면에 JWT는 자원문제를 해결할 수 있습니다.
JWT의 구조에대해 작성하겠습니다.
JWT의 구조는 다음과 같습니다. 헤더.내용.서명 이렇게 총 3개로 구성이 되어있는데요.
Header : 암호화 방식및 타입
Payload : 서버에 보내줄 데이터 ex)PK값
Sigbature : Base64 방식으로 인코딩한 Header, Payload, SecretKey를 더한 값
JWT 토큰 인증 절차
1. 사용자가 로그인을 한다.
2. ID/PW 검증 후 AccessToken 발급
3. AccessToken을 Header에 넣고 API 요청시 AccessToken을 Decode하여 사용자 정보를 가지고온다.
4. AccessToken을 탈취당할 시 사용자의 정보를 채갈 수 있다. 이를 막기위해 AccessToken의 만료시간을 설정한다.
5. 매 API 진행마다 AccessToken의 만료시간을 체크하고 유효한 Token이면 API 수행
6. 만료된 토큰이라면 다시 로그인해야한다. 이때 RefreshToken을 통해 AccessToken을 재발급할 수 있도록 설정
이게 전반적인 토큰 인증 절차이나 여러 Issue들이 발생한다. 해당 링크의 블로그를 보면 여러 Issue에 대해 정리해놓은 글이있습니다.
JWT 토큰 인증 절차
클라이언트와 서버 간의 JWT 토큰 인증 절차에는 AccessToken, RefreshToken, AccessToken 만료시간 등 여러 개념이 사용된다.하지만 이번 포스트에서는, 처음부터 전체 과정을 보지 않고 기본 단계에서부터
velog.io
다음 시간에는 Spring Security + JWT를 같이 이용하여 실습자료를 포스팅하겠습니다.
Spirng Security + Jwt 로그인 적용하기
프로젝트를 진행하면서 Spring Security + Jwt를 이용한 로그인을 구현하게 되었다. 목차 Spring Security JWT Spring SEcurity + JWT Spring Security > 가장먼저 스프링 시큐리티에 대해서 알아보자. Sprin
velog.io
'스프링' 카테고리의 다른 글
[Spring Security] + [JWT] + [RefreshToken] 스프링 시큐리티 JWT 로그인 적용기 (0) | 2022.08.18 |
---|---|
[Spring Security] + [JWT] 스프링 시큐리티 JWT 로그인[실습] (0) | 2022.08.12 |
스프링부트 게시판 작성/목록 머스테치로 구현하기 (0) | 2022.01.26 |
스프링 부트 JPA 게시물 수정 / 변경 (0) | 2022.01.17 |
스프링부트 JPA 게시판 글쓰기 구현 (0) | 2022.01.07 |