본문 바로가기
스프링

[Spring Security] + [JWT] 스프링 시큐리티 JWT 로그인[이론]

by DarrenH 2022. 8. 12.
반응형

오늘은 스프링 시큐리티를 이용한 JWT로그인을 포스팅하려고 합니다. 

 

스프링 공부를하면서 Spring Security 기능을 알게 되었는데 이기능을 자주 쓰기도 하고 보안에 취약하지 않은 것 같고 권한에 대해서도 인증절차가 잘 되어있어 현재 많이 사용되고있는 기능같습니다. 

[Spring Security]

 

1. Authentication(인증) : 사용자 인증 절차

 

2. Authorization(권한) : 사용자 권한/등급

 

이 두가지를 도와주는 것이 Spring Security인데요 인증 과정에 대해서 한번 살펴보겠습니다. 

이 이미지는 다른 사이트에서도 많이 보셨을텐데요 저희가 Spring Security를 이해하는데 도움이 되는 자료입니다. 

번호 순서대로 설명드리겠습니다.

1. Request요청이 들어온 뒤 AuthenticationFilter를 거치게 됩니다.

 

2. UsernamePasswordAuthenticationToken이라는 필터를 만나게 되는데요 이 필터는 

 

Spring Security에서 제공해주는 로그인 Form

스프링 시큐리티에서 제공해주는 로그인 폼인데요 여기서 사용자를 인증후 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에 대해 정리해놓은 글이있습니다. 

 

https://velog.io/@yena1025/JWT-%ED%86%A0%ED%81%B0-%EC%9D%B8%EC%A6%9D-%EC%A0%88%EC%B0%A8%EA%B0%80-%EB%A7%8C%EB%93%A4%EC%96%B4%EC%A7%84-%EA%B3%BC%EC%A0%95

 

JWT 토큰 인증 절차

클라이언트와 서버 간의 JWT 토큰 인증 절차에는 AccessToken, RefreshToken, AccessToken 만료시간 등 여러 개념이 사용된다.하지만 이번 포스트에서는, 처음부터 전체 과정을 보지 않고 기본 단계에서부터

velog.io

다음 시간에는 Spring Security + JWT를 같이 이용하여 실습자료를 포스팅하겠습니다. 

 

참고 자료 : https://velog.io/@jkijki12/Spirng-Security-Jwt-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0

 

Spirng Security + Jwt 로그인 적용하기

프로젝트를 진행하면서 Spring Security + Jwt를 이용한 로그인을 구현하게 되었다. 목차 Spring Security JWT Spring SEcurity + JWT Spring Security > 가장먼저 스프링 시큐리티에 대해서 알아보자. Sprin

velog.io

 

반응형