오늘은 스프링 시큐리티를 이용한 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에 대해 정리해놓은 글이있습니다.
다음 시간에는 Spring Security + JWT를 같이 이용하여 실습자료를 포스팅하겠습니다.
'스프링' 카테고리의 다른 글
[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 |