자바스크립트/라이브러리

아이언 세션 (Iron session) 이란 무엇인가? (쉬운 설명과 보안 관련 생각해볼점)

Jake Seo 2024. 4. 3. 21:16

iron session 이란?

  • 안전하고 무상태인 쿠키 기반의 세션 라이브러리

더 쉬운 말로 설명하면?

  • 사용자가 입력한 암호를 통해 쿠키값을 암호화하고 복호화해주는 것이다.
    • 쿠키는 원래 클라이언트에게 공개되고 클라이언트가 임의로 변경할 수 있는 값인데 이에 보안을 주기 위해서 암호화/복호화를 하는 것이다.

작동 방식

  • 세션 데이터가 서명되고 암호화된 쿠키에 저장된다.
  • 서버 코드에서 네트워크가 필요 없는 상태 비저장 방식으로 디코딩된다.
    • Ruby on Rails 에서 쓰는 것과 동일한 기술이다.

특징

  • 서버리스 환경에 적합하다.
    • 세션 데이터를 쿠키에 저장하여 별도의 서버측 저장소 필요 없음
  • 사용자 패스워드가 없어도 안전하게 암호화가 가능하다.
  • 미들웨어 하나로 쉽게 세션 기능을 추가할 수 있어서 러닝커브가 작다.

인증 프로세스 예시

  1. 사용자가 아이디/패스워드를 입력해 로그인한다.
  2. 서버에서는 사용자의 아이디/패스워드를 조회하고 일치한다면 사용자의 아이디를 문자열로 반환한다. ex. kakao123
  3. 사용자의 아이디 문자열이 브라우저로 전해진다.
  4. 브라우저는 사용자의 아이디 문자열을 Iron Session 에 개발자가 정한 시크릿키를 넣어 암호화하고 쿠키에 저장한다.
  5. 브라우저에는 암호화된 사용자 아이디 쿠키가 존재한다.
  6. 사용자의 인증정보가 필요할 때마다 브라우저는 암호화된 쿠키를 서버로 보낸다.
  7. 서버는 Iron Session 과 개발자가 정한 시크릿키를 이용하여 쿠키를 복호화한다. ex. kakao123
  8. 사용자의 아이디가 kakao123 이란 것을 알아낸 서버는 DB 에서 사용자 테이블에 kakao123 를 조건으로 입력해 쿼리를 날린다.
  9. 서버는 아이디를 가진 사용자의 이름, 이메일주소 등 필요한 정보를 가져올 수 있다.
  10. 사용자는 서비스 이용을 끝마치고 로그아웃을 누른다.
  11. 암호화된 세션은 브라우저에서 지워지고 로그아웃 처리가 되고 끝난다.

예시 코드 스니펫

// 세션 쿠키 생성
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();

코드 실행 결과 예시

  • 세션용 쿠키가 생성된 것을 볼 수 있다.

picture 0

보안과 관련해 생각해볼만한 점

  • 아이언 세션의 쿠키가 해커에게 노출되면 어떻게 해야 할까?
    • 해커는 쿠키를 저장해두었다가 계속 악용할지도 모르는 일이다.

조치 1: 아이피와 에이전트를 함께 암호화한다.

  • 이용자가 접근한 아이피와 에이전트를 함께 암호화하여 쿠키에 저장해둔다.
  • 해당 쿠키로 인증을 요청하면, 요청한 아이피와 에이전트를 함께 확인하여 해당 사용자가 맞는지 확인한다.
  • 만일, 다른 브라우저로 들어왔거나, 다른 아이피로 해당 쿠키를 이용한다면 새로 인증을 받아야 한다.

조치 2: 키 로테이션을 수행한다.

  • 1시간 마다 시크릿 키를 바꿔준다.
  • 시크릿 키를 사용한지 30분쯤에 새로운 시크릿 키를 발급한다.
  • 30분간 이전 시크릿 키와 새 시크릿 키 두벌을 사용한다.
  • 30분의 시간동안 이전 시크릿 키를 사용하여 접근한 사용자에게 새 시크릿 키를 이용한 암호화 쿠키를 새로 발급해준다.
  • 30분이 지나 새로운 시크릿 키가 발급되면, 이전 시크릿 키를 이용해 만든 암호화 키를 사용하는 사용자는 더이상 해당 시크릿 키를 사용할 수 없게 된다.
반응형