BACKEND

[JWT][백앤드] 인증관련 테스트 진행 with PostMAN

공부하고 기록하고 다시보는 블로그 2025. 1. 11. 18:06

 

 

2024-04에 진행했던 게시글 프로젝트, 정은수 연구원, 손현희 선임과 프로젝트시 사용자 인증 관련 기능을 넣고 싶었습니다. 

2025년 올해 드디어 적용했고, 총 4일이 걸렸습니다.

 

[고민했던 부분]

1. cookie, session, JWT 인증 방식 중 어느 것을 사용할까?

 

찾아보니,  다음과 같이 정리해보았습니다.

-> 쿠키는 그대로 인증 정보가 그대로 전달됨 암호화하더라도 복호화 하면되니, 문제가 발생함, 노출된 문제

-> 세션은 DB에서 인증 정보를 관리하므로, 대량의 요청이면, 서버 부하가 심하다. 서버에서 클라이언트의 상태를 유지하므로 http에  stateless라는  부분 위배

         

그래서, token 인증 방식에서는 

 

1. 클라이언트에서 인증 정보 관리statless 준수

2. Header, Payload, signature 토큰방식이므로 노출이 안됨

 

하지만, 가장 중요한 accessToekn을 갈취당하거나 위조하여 사용자가 악의정으로 내 계정을 사용한다면, refresh token이 만료될때까지 기다려야 합니다

 

그래서 access token은 10분과  refresh token은 30분 주었습니다.  하지만,  유효시간을 주어 해결할 순 없을꺼 같더군요.

 

현재 구축중인 프로젝트는 게시글프로젝트로 로그아웃이 필요한 비지니스적인 서비스 아니라고 생각해서 token방식을 사용했습니다.

 

무엇보다, access token, refresh token방식을 더 짧게 두고, JWT + 세션인증식을 더한, 하이브리드 인증 방식을 구축하는 것도 좋은 바법이라고 생각합니다. 아니면, 세션 인증 방법으로 보안이나 취약점을 잡으면서 커스텀하여 고객의 비지니스 적인 니즈를 충족 하는 것도 좋다고 봅니다.

 

그래도 무엇이든 완벽한 것은 없다고 봅니다. 어떤 서비스를 만드냐에 따라.. 결정되는 거 같습니다.

 

 

백앤드 환경 구성

Spring Boot, JDK 17, POSTMAN

 

의존성 주입

<!-- JWT (io.jsonwebtoken) -->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-api</artifactId>
            <version>0.11.5</version>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-impl</artifactId>
            <version>0.11.5</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-jackson</artifactId>
            <version>0.11.5</version>
            <scope>runtime</scope>
        </dependency>

 

폴더(트리)노드

 

프로젝트 규모마다 다르지만, Default 폴더 구조를 말씀드립니다.

Filter = JwtAuthenticationFilter.java

-> 요청이 들어올 때마다 실행되며, JWT토큰 검증하고, 사용자 정보도 저장하기[사용자 정보 DB에서 로드하기 위함]

Provider = JwtUtil.java

-> 토큰 생성, 만료 일시 생성등 역할을함 또는 토큰 유효성 검사

Config = SecurtyConfig

       
// CSRF : JWT를 사용하면, 설정 필요 없음
.
csrf(csrf -> csrf.disable()
 )

// JWT 기반이면, "비상태"로 설정 / 세션에 저장하지 않고 유지하지 않겠다.라는 뜻
.sessionManagement(session -> session
       .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
)

// 자바스크립트 공격 방지 : 악성 자바스크립트를 웹사이트에 삽입되어, 사용자가 그 코드를 실행
 .addHeaderWriter((request, response) ->
        response.addHeader("X-XSS-Protection", "1; mode=block")
 )

// 클라이언트의 JWT 인증 기반부터 유효한지 확인해야 합니다.
// 서버에서 클라이언트가 헤더로 보낸 JWT 토큰만 유효한지 보고 그 다음 비밀번호와 아이디를 검증합니다.
.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)

 

-> ServiceImpl[구현]과 Service[역할] 부분

    

  1.  구현부분에 auth/user/login로 클라이언트 요청이 들어오는 부분 구현함

 

 

PostMan으로 테스해보기

 

1. Login을 위한 별도의 토큰을 받기 - 백앤드로 /csrf GET 요청

 

2. 로그인하기

 

3. Header에서 발급받은 세션키로 /menu 접근해보기

 

 

유효하지 않은 토큰으로 /menus 접근시

 

스크립트 위조 방지를 위해서 X-XSRF-TOKEN으로 로그인 시도

access token에 유효시간이 있는 경우 정상적으로 데이터 호출

 

 

그 다음 추가할 부분 권한

 

[2025-01-13 ~ 2025-01-14] 까지 작업예정

- 권한에 따른 메뉴 VIEW 처리

- 사용자의 Refresh Token 별도의 DB 테이블에서 관리

 

- refresh부분 - refresh토큰이 유효기간이 남아 있다고 해서 자동으로 access token을 발급받는 것이 아니라, 사용자 스스로 로그인하면, 추가로 access 발급하고 refresh는 재갱신되도록함...

- refresh token이 아직 살아 있다면, access token만 발급받기... 둘다 만료면, 둘다 받기