[Node.js] 세션과 토큰의 장점 및 단점

Byron·2021년 8월 8일
0

Node.js

목록 보기
2/2

쿠키, 세션, 토큰 셋 다 인증의 수단이다.
오늘은 세션 및 토큰 기반 인증 방식에 대하여 알아보겠다.

Session

서버에 로그인 되어있는 상태를 세션이라고 한다.
세션 인증방식은, 접속 상태를 서버(or DB)가 가지고, 접속 상태 확인 및 권한 부여를 위해 sessionId를 쿠키로 클라이언트에게 전송하는 방식이다.
즉, 클라이언트의 중요한 데이터는 서버가 가지게 된다.
클라이언트는 전달받은 쿠키(sessionId)를 매 요청마다 자동으로 서버에 전송해 해당 요청이 서버에 연결된 상태라는 것을 알려주고, 서버는 전달받은 sessionId를 비교해 대답을 돌려준다.

장점: 
(쿠키에 비해)
1. 서버에 저장하기 때문에 매우 관리가 편하고 효율적이다.
2. 신뢰할 수 있는 유저인지 서버에서 추가로 확인이 가능하다.
단점: 
1. 세션은 서버의 메모리에 세션 정보를 저장한다. 
2. 이용자가 많으면 메모리 일정 부분을 항상 차지해 가용 메모리를 잡아먹고 서버 성능의 하락을 야기한다. 
3. 여전히 쿠키를 사용하기 때문에 XSS공격 등에 취약할 수 있다.
4. 하나의 서버에서만 접속 상태를 가지므로 서버가 재부팅하면 메모리에 있는 것들이 다 날아간다. 

Session based authentication


하지만 여전히 보안이 취약한 쿠키에 sessionId를 담아야 한다는 약점이..

이미지 출처: https://pstudio411.tistory.com/entry/HTTP-%EC%84%B8%EC%85%98session

Token

유저 정보를 토큰이라는 암호화한 상태로 클라이언트에 전달한다.
토큰은 header, payload, signature로 구성되는데 header에는 토큰의 종류와 암호화 알고리즘을, payload에는 유저의 정보와 권한 및 기타정보를, signature에는 header와 payload가 인코딩된 값 + salt값의 조합이 들어간다.
access token, refresh token 두 가지를 발급받는데, access token을 이용하여 서버의 api를 이용한다. access token이 만료되면 refresh token을 이용하여 다시 access token을 발급 받을 수 있다.
둘 다 만료시 다시 로그인하여 위 과정을 반복한다.

장점: 
1. Statelessness & Scalability(무상태성 & 확장성): 
서버는 클라이언트에 대한 정보를 저장할 필요가 없고, 토큰을 헤더에 추가만 하면 인증절차가 완료된다.
2. 안정성: 암호화 한 토큰을 사용하므로 암호화 키를 노출할 필요가 없다. 
3. 어디서나 생성 가능: 토큰을 생성하는 서버가 꼭 토큰을 만들지 않아도 된다. 
4. 권한 부여에 용이: 토큰의 Payload안에 어떤 정보에 접근 가능한지 정의가 되어 있다.
단점: 
1. JWT는 매우 복잡한 표준이어서 사용자가(개발자) 잘못 이해할 가능성이 있다. 
토큰 설정이 잘못되는 최악의 경우 모든 사용자들에게 유효한 JWT가 생성되어서 악용될 수 있다.
2. 로그아웃에 문제가 있다. 
전통적인 세션을 활용하는 방법의 경우, 단순히 세션 스토리지에서 해당 세션 값을 날리면 되었다.
그러나 JWT나 다른 무상태(stateless) 토큰으로는 이것이 불가능하다. 
토큰이 정보를 담고 있으며, 토큰의 상태를 관리하는 중앙 인증 관리 시스템이 없기 때문이다. 
3. JWT의 크기가 상대적으로 커서 쿠키에 JWT를 담으면 오버헤드가 발생한다.


*2번의 경우 아래 세가지 방법으로 해결할 수 있다.
1. 토큰의 생명 주기를 5분 이내로 
2. 만료될 시 새롭게 토큰을 만들게 
3. 최근에 만료된 토큰을 시스템에 저장하도록

Token based authentication

이미지 출처: https://doubleoctopus.com/security-wiki/network-architecture/stateless-authentication/

References

https://pstudio411.tistory.com/entry/HTTP-%EC%84%B8%EC%85%98session
https://doubleoctopus.com/security-wiki/network-architecture/stateless-authentication/
https://yceffort.kr/2021/05/drawback-of-jwt
코드스테이츠 - Immersive course_14. Authentication
https://devhaks.github.io/2019/04/20/session-strategy/
참고하면 좋은 github

profile
step by step

0개의 댓글