Q> Session ID, Access Token, JWT(JSON Web Token)이 어떻게 다른지 개발시 보안 고려사항에 대한 문의

사용자의 인증과 권한 부여를 위해 사용되는 대표적인 기술인 Session ID, Access Token, JWT가 어떻게 다른지 알고 싶습니다.
또한, 각 기술의 보안을 위해 고려해야 하는 주요 사항들을 알고 싶어서 도움을 요청합니다.

A>

<> Session ID, Access Token, JWT 특성 비교

- Session ID, Access Token, JWT(JSON Web Token)은 사용자(또는 시스템)에 대한 인증 및 권한부여를 위해 사용되는 대표적인 기술이다.
- 이 기술들은 실제 복합적으로 사용되지만 각기 목적과 저장위치, 생성 및 관리상의 특성이 있기 때문에 이를 잘 이해해야 적합한 기술을 유효적절하게 선택할수 있을 것이다.

구분 목적 생성방법 저장 위치 관리방법
Session ID 전통적인 Session기반의 인증에서 사용자의 인증 상태를 표현하는 기술이며, 클라이언트가 서버에 요청을 보낼때마다 해당 사용자의 상태를 식별할 수 있음 사용자가 로그인하면 서버는 데이터베이스 또는 메모리에 Session정보를 다양한 방법으로 생성하고 해당 Session의 고유 ID를 클라이언트에게 전달함 클라이언트의 브라우저에서 주로 Cookie 형태로 저장됨 서버는 Session ID를 통해서 사용자의 상태와 정보를 추적하고 관리함
Access Token 주로 OAuth 또는 OAuth2.0과 같은 권한부여를 위한 프레임워크에서 사용되는 기술이며, 사용자가 특정 리소스에 접근할 권한을 부여 받은 것을 식별할 수 있음 사용자가 권한부여 과정을 거친 후, 권한 서버는 Access Token을 생성하여 클라이언트에게 전달함 다양한 방법으로 저장할 수 있지만, 웹 어플리케이션에서는 주로 Cookie 또는 Web Storage(localStorage, sessionStorage)에 저장됨 Token은 주로 일정 시간동안 유효기간을 설정하는 것이 일반적이며, 유효기간이 만료되면 재로그인하여 서버에게 신규 Token을 발급받아야 함
JWT(JSON Web Token) Microservice Architecture와 같이 분산환경에서 사용자 인증과 권한 부여, 기타 사용자 정보, Token 만료기간 등의 정보를 JOSN형태의 Token으로 클라언트와 서버간 송수신하기 위해 사용되는 기술임 서버는 사용자 인증 처리 이후에 JWT를 생성하여 서버 비밀키로 서명하고 클라이언트에게 전달함 Cookie, Web Storage, HTTP header 등 다양한 방식으로 전달 및 저장됨 클라이언트가 서버에 요청할때 서버에게 받은 자신의 JWT를 보내면 서버는 이 JWT의 유효성과 무결성(구현에 따라 다름) 등을 검증하여 클라이언트의 요청을 처리함

<> Session ID 개발시 보안고려사항

1. 송수신암호화를 위한 SSL/TLS 적용
- Session ID에는 다양한 정보를 보관하게 되기 때문에 SSL/TLS로 통신구간 암호화를 적용하여 MITM을 방지하고 송수신 데이터의 안전성을 확보한다.
- 웹서버에 인증서를 설치하고 HTTPS를 활성화하여 구현할 수 있으며 모든 HTTP요청을 HTTPS로 리디렉션하도록 설정한다.

2. Cookie 접근제어를 위해 HttpOnly 설정
- JavaScript를 통한 Cookie접근을 제한하기 위하여 HttpOnly 플래그를 설정함으로써 XSS공격을 최소화 할 수 있다.
- HttpOnly 옵션을 포함하여 Cookie를 생성할 수 있으며 프레임워크에서 HttpOnly를 지원하는 경우에는 이 옵션 활성화를 통해 간간하게 구현할 수 있다.

document.cookie = "sessionid=1234567890; HttpOnly";


3. Cookie가 HTTPS를 통해서만 전송되도록 Secure Flag설정
- Cookie를 생성할 때 Secure 옵션을 추가하여 생성하면 Cookie를 HTTPS연결을 통해서만 전송함으로써 보안을 강화할 수 있다.
- 구현방법은 Cookie 생성시 Secure옵션을 추가하며, 프레임워크에서 Secure옵션을 지원하는 경우에는 이 옵션 활성화를 통해 간간하게 구현할 수 있다.

document.cookie = "sessionid=1234567890; Secure";   


4. Session의 유효기간을 위해 Timeout 설정
- 생성된 Session이 탈취될 경우, 공격자는 이를 분석하여 Replay attack 또는 패턴추축 등으로 악용될수 있다.
- 서버의 데이터베이스 또는 메모리에 Session 정보를 저장할 때 만료시간을 함께 저장하고 각 요청마다 Session의 만료시간을 확인하도록 구현한다.

5. 중요 업무처리시 Session 재생성 구현
- Session의 유효기간 설정으로 보안을 강화할 수 있으나, 비밀번호 변경, 권한 변경과 같이 중요한 업무처리가 발생하는 경우에는 Session을 재생성하여 발행함으로써 전통적인 Fixed Session Attack을 방지한다.
- 대부분의 프레임워크들이 Session Regeneration 메커니즘을 지원하므로 이 가능을 활용한다.

<> Access Token 개발시 보안고려사항

1. Token의 유효기간 설정
- Toke의 유출이나 탈취 상황을 고려하여 Token의 유효기간을 설정한다.
- OAuth2.0 또는 JWT 등에서 Token을 발급할때 'expires_in“ 또는 “exp”와 같은 속성을 설정하여 Token의 유효기간을 설정한다.
- 또한 서버에서는 유효기간이 만료된 Token은 거부하도록 구현한다.

2. 접근가능한 Resource 제한
- Token의 유출되는 만약의 경우에도 해당 Token으로 접근할 수 있는 리소스를 제한함으로써 피해범위를 최소화 한다.
- OAuth2.0의 경우 Token요청시 “scope”파라메터를 통해 Token의 리소스 접근범위를 지정할 수 있다.
- 또한 서버에서는 Token의 scope를 검사하여 해당 Token으로 수행할 수 있는 작업을 제한하도록 구현한다.

3. Token 무효화 구현
- 의심스러운 활동이 감지될 경우 해당 Token을 강제적으로 무효화하는 기능을 구현한다.
- Token을 무효화하는 별도 API를 구현하여 무효화된 Token을 거부하도록 한다.

4. 안전한 Token Storage 사용
- 서버가 생성하여 클라이언트에게 전달된 Token은 안전한 저장소에 저장되도록 한다.
- Web Application의 경우, Local Storage는 XSS공격에 취약하므로 Session Storage 또는 HttpOnly 옵션을 적용하여 구현한다.
- Mobile Application의 경우, iOS의 Keychain, 안드로이드의 Keystore와 같은 안전한 저장영역을 이용하여 Token을 저장한다.

<> JWT(JSON Web Token) 개발시 보안고려사항

JWT개발시 보안 고려사항은 그 내용이 많으므로 별도로 작성하겠음