티스토리 뷰

Web/Spring

[Spring/JWT] Session 인증 → JWT 인증

도도고영 2024. 7. 19. 15:25

1. Session 인증 → JWT 인증

 

올해 초에 개발한 프로젝트에서는 Interceptor를 사용하여 로그인과 인증 과정을 (코드는 '더보기' 참고) 구현하였다. 

사실 머쓱할 정도로... 단순하고 허접한 구현이라 구현을 했다고 보기도 어렵다. 

session에 id 속성이 있다면 모두 접근 허용을 해줬다.

 

해당 세션 정보를 별도의 DB에 저장을 하고 관리를 하는 방법으로 개선할 수 있을 거 같다. 

너무 구현자체에 급급했다. 

 

더보기
package semohan.owner.global.auth;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import semohan.owner.global.exception.CustomException;

import static semohan.owner.global.exception.ErrorCode.UNAUTHORIZED_USER;

@Slf4j
public class LoginCheckInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {

        String requestURI = request.getRequestURI();
        System.out.println("[interceptor] : " + requestURI);
        HttpSession session = request.getSession(false);

        log.info(session == null ? "session null" : "sesseion 있음");
        
        // 로그인 X
        if(session == null || session.getAttribute("id") == null) {
            throw new CustomException(UNAUTHORIZED_USER);
        }
        
        log.info("로그인 상태 확인 완료");

        // 로그인 O
        return true;
    }
}


여튼! 로그인다운 로그인을 구현해보고 싶어서 해당 프로젝트의 로그인, 인증 과정에 JWT를 사용해보고자 한다. 근데 하필 JWT를 사용하는 이유가 뭘까?? 아래의 세 가지 이유로 정리해 보았다.

 

1) 클라이언트가 상태(토큰)을 관리하기에 서버의 부담이 적다.

2) 해당 토큰을 다른 서버에서도 사용할 수 있다. 즉 확장성이 좋다.

3) 서명 기능을 포함하기에 위변조를 방지할 수 있다.


2. JWT

 

위의 장점들을 머리에 넣고 JWT에 대한 내용을 조금 더 살펴보면 아래와 같다. (유튜브, 책 등 참고)

 

JWT 구조

  • 헤더(Header): 토큰 타입과 해싱 알고리즘 정보를 포함한다.
  • 내용(Payload): 전송할 데이터를 포함한다.
  • 서명(Signature): 헤더와 내용을 시크릿키로 서명하여 토큰의 무결성을 보장한다.

JWT 사용

  • 인증(Authentication): 사용자 인증 후 서버가 JWT를 발급하며, 클라이언트는 이를 사용해 보호된 리소스에 접근한다.
  • 인가(Authorization): JWT를 통해 사용자의 권한을 검증한다.

스프링 시큐리티

  • 인증과 인가를 관리하는 프레임워크로, 디스패쳐 서블릿 전에 동작
  • JWT를 검증하여 사용자 인증을 처리

주의사항

  • 알고리즘 설정: 'none' 알고리즘 사용 금지
  • 디코딩 용이성: 쉽게 디코딩이 가능하기 때문에 내용에 최소한의 정보만 포함
  • 시크릿키 관리: 복잡하고 안전하게 관리

3. 구현 방법

우선 나는 프로그램 개발이 어느 정도 된 상태로 Entity, Repository 등의 작성은 쓰루 하겠다.

 

1) JwtTokenProvider 구현: JWT 토큰 생성하는 역할

2) JwtAuthenticationFilter 구현: 인증하는 역할 (디스패쳐 이전에 작동)

3)  SecurityConfiguration 구현: 스프링 시큐리티 사용하기 위한 설정

 

이런 순서로 진행하면 될 거 같다!

구현을 하며 작성하는 블로그인 만큼 틀린 부분이 많을 수도 있다... 

 

틀린점이 있다면 알려주세요 !!

그리고 구현에 대한 블로그는 다음글로 이어 작성하겠습니다 !!

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함