본문 바로가기
개발공부 개발새발/Spring

Spring Security ) JWT와 Session 인증 중에 무엇을 사용해야 좋을까?

by 휴일이 2023. 1. 6.

 

 

스프링 시큐리티를 구현하려고 하는데

유저를 인증하는 방식이 두 가지가 있다고 한다

'JWT' 토큰을 사용하는 방법과

'Session"을 사용하는 방법!

 

그러면, 어느 방식이 조을까 생각해보았다

 

 

 

일단, 세션은 서버 메모리에 저장되는 공간이며

고유 세션 ID로 유저를 구분한다

로그인 할 때 세션을 생성하면

서버는 쿠키에 세션ID 동봉해 HTTP 헤더에 보내준다(맞지..?)

 

그리고 유저가 요청을 하면

HTTP 헤더에 유저 쿠키가 같이 발송되고

쿠키는 서버에서 세션 아이디를 통해 일치하는 유저 정보를 가져와, 로그인한 유저가 맞는지 확인한다

 

그래서 가끔 브라우저가 먹통이라 쿠키 삭제를 하면

자동 로그인을 체크했던 사이트들도 다 초기화가 되는 현상이 있는 것이당...

 

 

근데, 이 방식에는 아쉬운 점이 있다

 

- 저장 공간 용량

세션은 유저 한 명당 하나씩 부여가 되는데

세션에 담긴 데이터의 양이 많아질 수록 서버에 부담이 된다

그래서 세션에 굳이 데이터를 담는다면,

되도록 담아서 옮긴 후 바로 삭제하는 것이 맞다(고 강의에서 봤음)

 

- 확장성 문제

서비스 규모가 커져서 서버를 여러대로 확장, 분산해야 한다면?

세션 분산 기술을 따로 설계해야 한다고 한다....

ㄴ 이게 젤 무셔웡

 

 

그래서 JWT 방식을 이용하는 것이 많다고 한다

 

 

 

그렇다면 JWT의 구조는 어떻게 될까용?

 

HEADER , PAYLOAD , SIGNATURE 로 나뉜다!

 

 

1) HEADER

헤더에는 토큰 종류와 SIGNATURE 생성을 위해 어떤 알고리즘을 사용했는지가 나온다

 

2) PAYLOAD

내가 로그인한 유저라는 것을 증명할 수 있는 기본적인 정보를 넣는다

클라이언트가 토큰을 보내면, 그걸 보고 DB의 유저 정보와 비교한다

 

3) SIGNATURE

토큰을 인코딩하거나, 유효성 검증을 할 때 사용하는 고유한 암호화 코드

서명은

1 - 헤더와 페이로드의 값을 각각 base64로 인코딩

2 - 인코딩 값을 내가 설정한 비밀 키를 이용해 헤더에 저장한 알고리즘과 비교

3 - 이 값을 다시 base64로 인코딩하여 생성한다

 

혹시, 토큰을 해킹범에게 들켜서 페이로드 정보가 바뀌면?

토큰의 값이 크게 변경되어 안심이다

 

 

 

그렇다면 JWT의 장단점은?

 

*장점

- 세션처럼 별도의 저장 공간을 차지하지 않는다

- 클라이언트는 토큰을 보관하고, 요청 헤더에 토큰을 실어보내면 된다

- 모바일 앱은 쿠키를 사용할 수 없으니, JWT를 사용해야 한다

 

*단점

- HTTP를 통해서 전송하므로, 페이로드의 크기가 클수록 데이터 전송 비용이 커진다

- 유효 기간을 설정하지 않는 이상 소멸되지 않아서, 장기간 방치하면 해킹 위험이 커진다

- JWT를 localstorage에 보관하면 xss공격에 취약해진다

 

@ XSS 란?

해킹범이 우리 프로그램에 특정한 자바스크립트 코드를 심어서

localstorage에 접근하는 공격이다

 

그래서, 보통 HTTPONLY를 설정해서

접근 가능한 쿠키에 토큰을 실어보내, XSS 공격을 막는다

 

 

그런데, 만약 로그인을 안 해도 사용할 수 있고

관리자 정도만 로그인하는 방식이라면

굳이 JWT토큰을 쓰지 않고 그냥 Session 인증을 해도 상관없다고 한다

 

 

 

궁시렁 프로도의 꿀팁

 

 

 

JWT 토큰을 사용하는 방식은 세션을 사용하는 방식보다 까다롭다고 하는데

이것은 나의 도전 정신을 자극한다...

 

정복감 츄릅..........

성공해보이겟다...

728x90