iron session 이란?
- 안전하고 무상태인 쿠키 기반의 세션 라이브러리
더 쉬운 말로 설명하면?
- 사용자가 입력한 암호를 통해 쿠키값을 암호화하고 복호화해주는 것이다.
- 쿠키는 원래 클라이언트에게 공개되고 클라이언트가 임의로 변경할 수 있는 값인데 이에 보안을 주기 위해서 암호화/복호화를 하는 것이다.
작동 방식
- 세션 데이터가 서명되고 암호화된 쿠키에 저장된다.
- 서버 코드에서 네트워크가 필요 없는 상태 비저장 방식으로 디코딩된다.
- Ruby on Rails 에서 쓰는 것과 동일한 기술이다.
특징
- 서버리스 환경에 적합하다.
- 세션 데이터를 쿠키에 저장하여 별도의 서버측 저장소 필요 없음
- 사용자 패스워드가 없어도 안전하게 암호화가 가능하다.
- 미들웨어 하나로 쉽게 세션 기능을 추가할 수 있어서 러닝커브가 작다.
인증 프로세스 예시
- 사용자가 아이디/패스워드를 입력해 로그인한다.
- 서버에서는 사용자의 아이디/패스워드를 조회하고 일치한다면 사용자의 아이디를 문자열로 반환한다. ex.
kakao123
- 사용자의 아이디 문자열이 브라우저로 전해진다.
- 브라우저는 사용자의 아이디 문자열을 Iron Session 에 개발자가 정한 시크릿키를 넣어 암호화하고 쿠키에 저장한다.
- 브라우저에는 암호화된 사용자 아이디 쿠키가 존재한다.
- 사용자의 인증정보가 필요할 때마다 브라우저는 암호화된 쿠키를 서버로 보낸다.
- 서버는 Iron Session 과 개발자가 정한 시크릿키를 이용하여 쿠키를 복호화한다. ex.
kakao123
- 사용자의 아이디가
kakao123
이란 것을 알아낸 서버는 DB 에서 사용자 테이블에kakao123
를 조건으로 입력해 쿼리를 날린다. - 서버는 아이디를 가진 사용자의 이름, 이메일주소 등 필요한 정보를 가져올 수 있다.
- 사용자는 서비스 이용을 끝마치고 로그아웃을 누른다.
- 암호화된 세션은 브라우저에서 지워지고 로그아웃 처리가 되고 끝난다.
예시 코드 스니펫
// 세션 쿠키 생성
const session = await getIronSession(cookies(), {
// 세션 쿠키의 이름은 karrot 이 된다.
cookieName: "karrot",
// 쿠키의 복호화를 위해 필요한 문자열을 .env 에서 가져온다.
password: process.env.COOKIE_PASSWORD!,
});
// user.id 에는 실제 계정의 id 값이 들어있다.
// session.id 에 user.id 를 할당하면
// 이는 iron-session 을 통해 암호화된 값으로 karrot 세션 쿠키에 들어갈 것이다.
//@ts-ignore
session.id = user.id;
// 세션 저장
await session.save();
코드 실행 결과 예시
- 세션용 쿠키가 생성된 것을 볼 수 있다.
보안과 관련해 생각해볼만한 점
- 아이언 세션의 쿠키가 해커에게 노출되면 어떻게 해야 할까?
- 해커는 쿠키를 저장해두었다가 계속 악용할지도 모르는 일이다.
조치 1: 아이피와 에이전트를 함께 암호화한다.
- 이용자가 접근한 아이피와 에이전트를 함께 암호화하여 쿠키에 저장해둔다.
- 해당 쿠키로 인증을 요청하면, 요청한 아이피와 에이전트를 함께 확인하여 해당 사용자가 맞는지 확인한다.
- 만일, 다른 브라우저로 들어왔거나, 다른 아이피로 해당 쿠키를 이용한다면 새로 인증을 받아야 한다.
조치 2: 키 로테이션을 수행한다.
- 1시간 마다 시크릿 키를 바꿔준다.
- 시크릿 키를 사용한지 30분쯤에 새로운 시크릿 키를 발급한다.
- 30분간 이전 시크릿 키와 새 시크릿 키 두벌을 사용한다.
- 30분의 시간동안 이전 시크릿 키를 사용하여 접근한 사용자에게 새 시크릿 키를 이용한 암호화 쿠키를 새로 발급해준다.
- 30분이 지나 새로운 시크릿 키가 발급되면, 이전 시크릿 키를 이용해 만든 암호화 키를 사용하는 사용자는 더이상 해당 시크릿 키를 사용할 수 없게 된다.
반응형
'자바스크립트 > 라이브러리' 카테고리의 다른 글
자바스크립트의 Socket.io 라이브러리란? (웹소켓 통신 라이브러리) (0) | 2024.02.10 |
---|---|
자바스크립트 라이브러리 Axios 란? (0) | 2022.10.19 |
Socket.io 소켓 IO 란? (0) | 2022.10.15 |
리덕스 툴킷 (Redux toolkit) 이란? (0) | 2022.10.13 |
리덕스 핵심 개념 10분만에 배우기 (0) | 2022.10.10 |