JWT 처리 과정

zhzkzhffk·2022년 6월 20일
0

전통적인 인증 시스템

서버 기반 인증 시스템은 로그인 시 세션ID를 클라이언트에게 발급해주고 클라이언트는 요청 시마다 세션 ID가 담긴 쿠키를 헤더에 담아 보내는 방식이다. 상태를 유지해야 하므로 Stateful한 구조이다.

**인증방식**
1. 클라이언트 로그인 요청 시 올바른 사용자임을 확인하고, 서버는 고유한 세션 ID 값을 부여하여 세션 저장소에 저장하고 사용자에게 발급해준다.
2. 클라이언트는 세션 ID를 받아 쿠키에 저장하고, 인증이 필요한 요청마다 쿠키에 세션 ID를 담아 헤더에 실어 보낸다.
3. 서버에서는 쿠키를 받아 세션 저장소와 올바른 요청인지 확인한다.
4. 인증이 완료되고 서버는 요청에 응답한다.

@PostMapping("/login")
public String loginResult(@Valid @ModelAttribute("loginDto") LoginDto loginDto, 
						Errors errors, HttpSession session, HttpServletResponse response) {

	User findUser = userRepository.findByUserId(loginDto.getUserId());

	if (findUser == null) {
            return "user/loginForm";
    } else {
    	if (findUser.getPwd().equals(loginDto.getPwd())) {
            session.setAttribute("auth", loginDto);
        } else {
            errors.rejectValue("pwd", "notCorrectPwd");
          }
    }
}

**문제점**

  • 세션을 서버가 저장해야 하므로 사용자가 늘어날 경우 서버 메모리에 부하가 걸리게 된다.
  • 세션과 쿠키는 모바일 애플리케이션에서 공유 불가하기에 유효하게 사용할 수 없습니다. (시스템 확장이 어렵다)
  • 렌더링된 HTML 페이지가 반환되지만, 모바일 애플리케이션에서는 JSON(or XML)과 같은 포맷이 필요합니다.

Token 기반 인증 시스템


JWT는 Json Web Token의 약자로 인증에 필요한 정보를 암호화시킨 토큰을 뜻한다. 세션/쿠키 방식과 유사하게 클라이언트는 Access Token(JWT)을 http Header 실어 서버로 요청한다.
사용자의 인증 정보를 더 이상 서버에 저장하지 않고 클라이언트의 요청으로만 인가를 처리할 수 있도록 Stateless 한 구조를 가진다.
기존의 인증 방법과 다르게 Token 기반 인증 시스템은 토큰 안에 유저의 정보를 넣는다는 점이다.

**JWT (JSON Web Token)**

  • 인증 헤더 내에서 사용되는 토큰 포맷
  • 두 개의 시스템끼리 안전한 방법으로 통신이 가능합니다.
  • https://jwt.io/

**장점**

  • 클라이언트 독립적인 서비스(statelss)
  • CDN
  • No Cookie-Session(No CSRF, 사이트간 요청 위조)
  • 지속적인 토큰 저장
  • 기존의 방식은 sessionId의 저장소의 관리가 필요하지만 Access Token을 발급해준 후 요청이 들어오면 검증만 해주면 된다.

**단점**

  • 전통적인 세션 저장소를 사용하는 경우에는 해당 세션이 악의적으로 사용될 경우 지워버리면 되지만, JWT는 한 번 발급되면 유효기간이 완료될 때 까지는 계속 사용이 가능하다. 😭
profile
Backend Developer

0개의 댓글