불충분한 세션 만료(SC)
주요정보통신기반 웹 취약 분석 평가 방법 18번째 항목인 불충분한 세션 만료(improper Session Close/SC)다.
음.. 보통 세션 만료라 할때 expire라고 하지 않나?
아무튼 주통기반에서는 불충분한 세션 만료에 대해 아래와 같이 설명하고 있다.
세션의 만료 기간을 정하지 않거나, 만료기한을 너무 길게 설정된 경우 악의적인 사용자가 만료되지 않은 세션을 활용하여 불법적인 접근이 가능할 수 있음
세션이 유지되고 있다는 것은 인증>인가에 성공하여 권한을 부여받은 상태라는 것이고 이 세션의 만료 기간을 설정하지 않아서 아무런 행위가 일어나지 않고 있음에도 세션이 유지되어 있다면 특정 권한을 가지고 있는 상태인만큼 공격을 받았을 때 위험이 커질 수 있다.
그래서 생각해보면 특정 사이트는 로그인하고 시간이 지나면 세션이 만료되어 다시 로그인해달라고 하기도 하고, 네이버는 그렇게 까지는 하지 않더라도 메일함 같이 중요한 혹은 민감할 수 있는 기능에는 시간이 지나면 다시 로그인하라고 요청하기도 한다.
어? 그런데 초대형 검색 엔진 사이트인 구글에서 세션으로 인해 다시 로그인하는 경우는 없었지 않은가? 보안에 치중한 시스템을 만들다보면 사용자가 이용하는데 있어서 불편한 경험을 많이 하게 된다. 그래서 기업들은 이러한 UX와 보안 사이에서 고민을 하게 되는데 당연히 가장 좋은 것은 보안을 우선 순위로 신경쓰되 사용자의 불편을 최대한으로 덜어주는 것이다. 지금 설명할 경우도 이와 같은데 구글에서는 세션이 만료되면 사용자에게 다시 로그인할 것을 요구하지 않고 refresh token을 사용하여 세션을 다시 설정해준다. 대신에 기존과 다른 IP라던가 터미널로 접속하게 되면 재인증을 요구하기도 하고, refresh token을 탈취하려는 공격에 대응하는 방어 등 여러 보안적인 측면도 가미되어 있으나 요건 너무 깊게 들어갈 것 같다.
서론이 또 또(...) 길었나 ㅎㅎ; 그래도 도움이 안 될 만한 소리들은 아닐테니 ㅠ.ㅠ 다시 세션 만료로 돌아와서 특정 사이트에 세션을 연결한지 한참 지났는데도 만료 없이 그대로 유지된다면 그 사이트에는 불충분한 세션 만료 취약점이 있다고 평가할 수 있다.
조치를 취하는 방법은 간단하다! 세션이 특정 시간이 지나면 만료될 수 있게 설정해주면 된다.
SC의 보안설정방법과 함께 알아보자.
- 세션 타임아웃 구현 시 타임아웃 시간은 10분으로 설정할 것을 권고함
보통 10~30분 사이 시간을 타임아웃으로 설정한다. 개인적으로 10분은 너무 짧지 않나 싶다. 정말 간단하게 로그인만 하고 다른 작업을 하는 곳에나 10분을 쓰려나??
1) php에서 세션 타임아웃 설정
php에서는 php 설정 파일(php.ini)을 통해서 세션 타임아웃을 설정할 수 있다.
php.ini에 들어가보니 기본으로 24분이 설정이 되어 있던 것 같다.
2) ASP에서 세션 타임아웃 설정
asp에서는 아래와 같이 설정한다고 한다.
Session.timeout = 10
참 간단한게 보기 좋지만 ASP는 요새 잘 사용되는지 모르겠고 많이 들어봤을 법한 ASP.NET이 더 많이 사용중이다.
ASP.NET은 web.config안의 timeout 속성에서 설정할 수 있다.
<sessionState timeout="30" />
3) JSP에서 세션 타임아웃 설정
주통기반에서는 session.getLastAccessedTime()을 이용하여 세션의 마지막 접근 시간으로부터 일정 시간동안 세션 접근을 하지 않은 경우 세션을 종료하도록 한다고 되어 있다.
session.getLastAccessedTime()은 세션이 연결된 사용자가 마지막으로 서버에 접근한 시간을 나타낸다고 한다.
두 가지로 설정할 수 있는데
- 모든 사용자 세션에 적용하는 방법(web.xml)
<session-config>
<session-timeout>10</session-timeout>
</session-config>
- 개별적으로 세션 적용
session.setMaxInactiveInterval(1200);
web.xml로 설정한 것은 단위가 분 단위 이므로 10분이고, setMaxInactiveInterval() 메서드는 초 단위 이므로 20분이다. 메서드를 사용하면 특정 시점에 세션 타임아웃을 지정할 수 있고, 그 세션에만 적용이 된다.