037 레일스 쿠키와 보안 문제
036 12월 1일에 열리는 제5회 루비세미나 / 절대 주관적인 루비 뉴스
쿠키라는 녀석이 항상 골치다. 대부분의 인증 기반 서비스에서 반드시 사용하는 것인데, 조심해서 다루지 않으면 큰 문제를 야기할 수도 있다(참조: 레일스 보안 가이드). 최근에 레일스 커뮤니티에서 쿠키와 보안 문제에 대한 이슈가 두가지 있어서 여기 소개한다.
레일스 1.2.x에서 수정된 Session Fixation Attack
최근 레일스 1.2.6이 공개되었다(참조: Ruby on Rails 1.2.6: Security and Maintenance Release). 이 릴리즈에서는 가장 시선을 끄는 것은 'session fixation attack'을 막기 위한 코드다. 레일스 1.2.4 이후에는 session_id를 쿠키에서만 가져오도록 수정되었다. 세션 옵션 중 cookie_only를 끄면 이전 처럼 동작한다. 하지만 그럴 필요가 있을까?.
- Disable non-cookie sessions to prevent Session Fixation Attacks
- Refactor cookie_only option to survive multiple requests and add regression tests.
레일스 2.0의 쿠키 세션 스토어
레일스에서 세션을 저장하는 방법은 여러가지다.
-
파일 시스템
- PStore
-
데이터베이스
- ActiveRecordStore
- SQLSessionStore
-
메모리
- DRBStore
- MemCacheStore
레일스 1.x에서 기본으로 사용하는 것은 다름 아닌 PStore다. 하지만 이는 성능상의 문제가 있고, 웹서버가 2대만 되어도 무용지물이다. 성능을 따지면 메모리를 사용하는 방법이 가장 좋지만, 이는 세션 서버가 재시작되면 모든 세션이 무효화되어버리는 문제점이 있다. 데이터베이스가 그 절충안이 될 수 있겠지만, 좋은 성능을 바라기 힘들다.
그래서 레일스 2.x에서는 클라이언트 쿠키에 모든 세션을 저장하는 다소 과격해 보이기까지하는 방법을 택하고 있다. 이 방법은 4K라는 크기의 제약이 있기는 하지만, 서버의 자원을 사용하지 않는다는 점에서 성능상으로는 최고 우위에 있다고 할 수 있다. 하지만 보안을 생각하면 어떨까? 최근 레일스 2.0의 쿠키 스토어가 보안에 취약하다는 글이 올라와서 화제다.
개인적으로는 쿠키 세션 스토어가 아주 위험하다고 생각하지는 않는다. 하지만 거기에는 개발자가 취약점이 있을 수 있다는 사실을 잘 인식하고, 아래 내용에 주의할 때의 이야기다.
- 세션에 많은 내용을 담지 않는다. 최대 4K
- 세션에 identifier 이외의 중요한 정보를 담지 않는다.
- 유추할 수 없는 보안키를 사용한다. 최근에는 이 키를 30자 이상 지정하도록 하는 코드와 보다 안전한 키를 만드는 생성기 코드가 반영되기도 했다.
- 레일스 쿠키 스토어는 세션 해시를 문자열로 바꿔 Base64한 값고 이 값에 대한 digest로 구성되어 있다. 따라서, 클라이언트에서 세션의 내용을 쉽게 읽을 수 있다. 이 점이 싫다면 쿠키 전체를 암호화하는 코드를 작성해 사용한다.
안전한 코드를 작성하는 것은 정말 어려운 일이면서 꼭 해야하는 일이다.
참조
- 2007/11/28 15:18:42
Comments (0)