[Spring Security] OAuth + JWT 작동 방식

5tr1ker·2022년 10월 25일
post-thumbnail

사용자가 로그인을 하게 되면 JWT 토큰을 전달하고 AccessToken 이 만료가 되면 Refresh Token을 이용해 새로운 AccessToken을 발급하는 방식을 사용했습니다.

OAuth 로그인 시 JWT 발급 과정

1 . 사용자가 OAuth 2.0 인증 서버에 로그인을 하게 되면 클라이언트 서버로 Redirect 와 함께 쿼리 파라미터로 code 값을 발급합니다.
2 . 클라이언트는 서버에 code 값을 전달하고 , 서버측은 OAuth 2.0 서버에 code 값을 전송 후 Access Token 요청합니다.
3 . 서버는 Access Token을 이용해 사용자 정보를 요청합니다.
4 . 사용자 정보를 이용해 회원가입 / 로그인을 진행하고 , 동시에 JWT 토큰을 생성 후 클라이언트에 전송합니다.
5 . 이후 요청마다 클라이언트는 헤더에 AccessToken을 넣어 요청하고 , 만약 AccessToken이 만료됐을 때 RefreshToken을 전송 해 새로운 AccessToken을 발급받습니다.

일반 로그인 시 JWT 발급 과정

1 . 클라이언트가 로그인 정보를 서버에게 요청합니다.
2 . 서버에 DB에서 확인 후 사용자 정보가 있으면 AccessTokenRefresh Token을 발급합니다.
3 . 이후 요청마다 클라이언트는 헤더에 AccessToken을 넣어 요청하고 , 만약 AccessToken이 만료됐을 때 RefreshToken을 전송 해 새로운 AccessToken을 발급받습니다.

OAuth 2.0 개념

OAuth2.0 이란 서비스 회사에서 접근 권한을 얻고 그 권한을 이용해 개발할 수 있도록 도와주는 프레임워크로 , 네이버 , 구글에서 로그인을 하면 직접 구현한 사이트에서도 로그인 인증을 받을 수 있도록 해줍니다.

구글에서 로그인을 하면 Access Token을 발급 받고 , 그 토큰을 이용해 해당 정보 권한을 받아와 서버에서 활용할 수 있습니다.

  • Resource Owner : 개인 정보의 소유자이며 Spring 서버가 해당합니다.
  • Client : 제 3의 서비스로 인증을 받습니다.
  • Resource Server : 개인정보를 저장하고 있는 서버입니다. 예)구글

API 요청할 때 로그인이 필요한 요청은 어떻게 관리할까?
Spring Security + JWT 로 인증 , 인가를 해결해보자

사용자 홈페이지에 그대로 노출되어 변조 위험이 있는 Cookies
Cookies를 보완하고자 사용자 요청 정보를 서버에 저장하기에 과부하 위험과 cors 문제가 있는 Session ,
stateless한 서비스인 Spring Security JWT로 Cookies & Session이 가지고 있는 단점을 잡아보자!

그렇다고 JWT가 모두 좋다는건 아니다. 물론 서버에 사용자 정보를 저장하는 세션은 보안은 좋지만 서버의 자원이 많이 필요하고, 만들어진 세션 ( 서버 ) 에서만 요청을 보내야 하는 단점이 있다.

예시 ) 서버 1 ~ 10까지 있을 때 서버 1에 세션이 있다면 서버 1에서만 접근 해야한다.

JWT은 클라이언트가 서버에서 발행하는 토큰을 가지고 브라우저에 저장하는 방식으로 해당 토큰이 유효한지만 확인하면 되기에 확장성 보안성이 좋다.

하지만 전자 서명된 JWT은 트래픽이 없고 독립적 이지만 JWT가 커질수록 트래픽이 무거워지고 , 서버에서 값이 바뀌어도 토큰에 적용되지 않는다.

JWT는 로그인 정보가 필요한 API Call 마다 header 에 jwt 를 실어 보내고 서버는 확인을 한다.

참고 서류

Access Token vs Refresh Token
https://velog.io/@junghyeonsu/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%90%EC%84%9C-%EB%A1%9C%EA%B7%B8%EC%9D%B8%EC%9D%84-%EC%B2%98%EB%A6%AC%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95
https://velog.io/@dyparkkk/spring-sequrity-jwt-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0access-token-refresh-token

profile
https://github.com/5tr1ker

0개의 댓글